活動選擇
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; }