題目連接(OJ的測試數據有誤)算法
假設有一個須要使用某一資源的n(n≤1000)個活動組成的集合S,S={1,…,n}。該資源一次只能被一個活動佔有,每個活動有一個開始時間bi和結束時間ei(bi≤ei)。若bi>ej或者bj>ei,則活動i和活動j兼容。測試
你的任務是是:選擇由互相兼容的活動組成的最大集合。spa
共n+1行,其中第1行爲n,第2行到第n+1行表示n個活動的開始時間和結束時間(中間用一個空格隔開),格式爲:3d
ncode
b1 e1blog
…….排序
bn enip
共有兩行,第1行爲知足要求的活動佔用的時間t,第2行爲最大集合中的活動序號,每一個序號之間用一個空格隔開。資源
樣例輸入 Sample Input
11
3 5
1 4
12 14
8 12
0 6
8 11
6 10
5 7
3 8
5 9
2 13get
14
2 3 6 8
算法分析
貪心算法的典型題。
原題OJ的測試數據有誤,這裏僅僅記錄一下代碼
1 #include<stdio.h> 2 #include<stdlib.h> 3 typedef struct 4 { 5 int No; 6 int begin,end; 7 int select;//select==1表示被選中,select==0表示該活動不被選中。 8 }obj; 9 int cmp(const void *x,const void *y)//按結束時間從小到大排序。結束時間相等則按開始時間從大到小排序 10 { 11 obj xx,yy; 12 xx=*(obj *)x; yy=*(obj*)y; 13 if(xx.end<yy.end) return -1; 14 else if(xx.end>yy.end) return 1; 15 else 16 { 17 if(xx.begin>=yy.begin) return -1; 18 else if(xx.end<yy.end) return 1; 19 } 20 } 21 int cmp2(const void *x,const void *y)//按序號從小到大排序 22 { 23 obj xx,yy; 24 xx=*(obj *)x; yy=*(obj*)y; 25 if(xx.No<=yy.No) return -1; 26 else if(xx.No>yy.No)return 1; 27 } 28 int main() 29 { 30 freopen("2610.in","r",stdin); 31 obj a[1002]; 32 int n,i,lastSelectedRight; 33 int t=0; 34 int ansNo[1002]; 35 36 scanf("%d",&n); 37 for(i=0;i<n;i++) 38 { 39 scanf("%d%d",&a[i].begin,&a[i].end); 40 a[i].No=i+1; a[i].select=0; 41 } 42 qsort(a,n,sizeof(a[0]),cmp); 43 44 a[0].select=1; 45 lastSelectedRight=a[0].end; 46 for(i=1;i<n;i++) 47 { 48 if(a[i].begin>lastSelectedRight) 49 { 50 a[i].select=1; 51 lastSelectedRight=a[i].end; 52 } 53 } 54 55 for(i=0;i<n;i++) 56 { 57 if(a[i].select==1) t=t+a[i].end-a[i].begin+1; 58 } 59 printf("%d\n",t); 60 qsort(a,n,sizeof(a[0]),cmp2); 61 for(i=0;i<n;i++) 62 { 63 if(a[i].select==1) printf("%d ",a[i].No); 64 } 65 return 0; 66 }
提交後提示以下。從提示便可知道數據有誤。