题目连接(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 }
提交后提示以下。从提示便可知道数据有误。