比方有5个活动,開始与截止时刻分别为:
最佳安排序列为:1,4,5。php
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; }