活动选择问题(贪心)
活动选择
Time Limit: 1000ms Memory limit: 65536K 有疑问?点这里^_^
题目描写叙述
学校的大学生艺术中心周日将面向全校各个学院的学生社团开放,但活动中心同一时候仅仅能供一个社团活动使用,而且每个社团活动開始后都不能中断。如今各个社团都提交了他们使用该中心的活动计划(即活动的開始时刻和截止时刻)。请设计一个算法来找到一个最佳的分配序列,以可以在大学生艺术中心安排不冲突的尽可能多的社团活动。
比方有5个活动,開始与截止时刻分别为:
最佳安排序列为:1,4,5。
输入
第一行输入活动数目n(0<n<100)。
以后输入n行,分别输入序号为1到n的活动使用中心的開始时刻a与截止时刻b(a,b为整数且0<=a,b<24,a,b输入以空格分隔)。
以后输入n行,分别输入序号为1到n的活动使用中心的開始时刻a与截止时刻b(a,b为整数且0<=a,b<24,a,b输入以空格分隔)。
输出
输出最佳安排序列所包括的各个活动(依照活动被安排的次序,两个活动之间用逗号分隔)。
演示样例输入
6 8 10 9 16 11 16 14 15 10 14 7 11
演示样例输出
1,5,4
非常经典的贪心题,首先把这一系列活动的起始时间与结束时间按结束时间升序排序,首先把第一个活动(排完序之后)纳入决策之中,然后往下扫,每当下一个活动的開始时间大于等于上一个活动的结束时间时,就将次活动纳入决策之中。扫一遍,ok 贪心完毕
#include <stdio.h> #include <stdlib.h> #include <iostream> #include <algorithm> using namespace std; struct select { int tag; int begin; int end; }; struct select act[111]; int res[111]; bool cmp(struct select x,struct select y) { return x.end<y.end; } int main() { int n,i,j; cin>>n; for(i=0;i<n;i++) { cin>>act[i].begin>>act[i].end; act[i].tag=i+1; } sort(act,act+n,cmp); j=0; bool a[100]; a[0]=true; for(i=1;i<n;i++) { if(act[i].begin>=act[j].end)//贪心核心算法 { j=i; a[i]=true; } else a[i]=false; } int p=0; for(i=0;i<n;i++) if(a[i]) res[p++]=act[i].tag; for(i=0;i<p;i++) if(i!=p-1) cout<<res[i]<<","; else cout<<res[i]<<endl; return 0; }