活动选择
Time Limit: 1000ms Memory limit: 65536K 有疑问?点这里^_^
题目描写叙述
比方有5个活动,開始与截止时刻分别为:
最佳安排序列为:1,4,5。
输入
以后输入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; }