2610 活动选择

题目连接(OJ的测试数据有误)算法

题目描述  Description

假设有一个须要使用某一资源的n(n≤1000)个活动组成的集合S,S={1,…,n}。该资源一次只能被一个活动占有,每个活动有一个开始时间bi和结束时间ei(bi≤ei)。若bi>ej或者bj>ei,则活动i和活动j兼容。测试

你的任务是是:选择由互相兼容的活动组成的最大集合。spa

输入描述  Input Description

共n+1行,其中第1行为n,第2行到第n+1行表示n个活动的开始时间和结束时间(中间用一个空格隔开),格式为:3d

ncode

b1  e1blog

…….排序

bn  enip

输出描述  Output Description

共有两行,第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

样例输出  Sample Output

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 }

 

提交后提示以下。从提示便可知道数据有误。

相关文章
相关标签/搜索