活動選擇 Time Limit: 1000MS Memory Limit: 65536KB Submit Statistic PRoblem Description
學校的大學生藝術中心周日將面向全校各個學院的學生社團開放,但活動中心同時只能供一個社團活動使用,并且每一個社團活動開始后都不能中斷?,F在各個社團都提交了他們使用該中心的活動計劃(即活動的開始時刻和截止時刻)。請設計一個算法來找到一個最佳的分配序列,以能夠在大學生藝術中心安排不沖突的盡可能多的社團活動。 比如有5個活動,開始與截止時刻分別為:
最佳安排序列為:1,4,5。
Input
第一行輸入活動數目n(0<n<100); 以后輸入n行,分別輸入序號為1到n的活動使用中心的開始時刻a與截止時刻b(a,b為整數且0<=a,b<24,a,b輸入以空格分隔)。
Output
輸出最佳安排序列所包含的各個活動(按照活動被安排的次序,兩個活動之間用逗號分隔)。
Example Input
6 8 10 9 16 11 16 14 15 7 11
Example Output
1,5,4
**第一個選取的是最早結束的事件 下一個要選取的事件是上一個選取的事件結束之后開始的事件中最早結束的事件**
#include<stdio.h>struct node{ int num; int a; int b;}x[110],t;void ouput(int f[],int n){ int i; printf("%d",x[0].num); for(i=1;i<n;i++) { if(f[i]==1) printf(",%d",x[i].num); }}int main(){ int j,n,i,o,f[200]={0};//f標記變量 while(scanf("%d",&n)!=EOF) { for(i=0;i<n;i++) { scanf("%d%d",&x[i].a,&x[i].b); x[i].num=i+1; } for(i=0;i<=n-2;i++) { for(j=0;j<=n-i-2;j++) { if(x[j].b>x[j+1].b) { t=x[j];x[j]=x[j+1];x[j+1]=t; o=f[j];f[j]=f[j+1];f[j+1]=o; } } } int timestart=0; i=0; while(i<n) { if(x[i].a>=timestart) { f[i]=1; timestart=x[i].b; } i++; } ouput(f,n); } return 0;}新聞熱點
疑難解答