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 }

 

提交後提示以下。從提示便可知道數據有誤。

相關文章
相關標籤/搜索