1. 程式人生 > >CODEVS 2610活動選擇

CODEVS 2610活動選擇

input log span ++ 需要 using con tro ()

2610 活動選擇

題目描述 Description

假設有一個需要使用某一資源的n(n≤1000)個活動組成的集合S,S={1,…,n}。該資源一次只能被一個活動占有,每一個活動有一個開始時間bi和結束時間ei(bi≤ei)。若bi>ej或者bj>ei,則活動i和活動j兼容。

你的任務是是:選擇由互相兼容的活動組成的最大集合。

輸入描述 Input Description

共n+1行,其中第1行為n,第2行到第n+1行表示n個活動的開始時間和結束時間(中間用一個空格隔開),格式為:

n

b1 e1

…….

bn en

輸出描述 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 13

樣例輸出 Sample Output

14

2 3 6 8

數據範圍及提示 Data Size & Hint

數據範圍不大,不用考慮。

這道題是個大坑,除非打表,否則不可能通過,因為測試數據粘上了其他題目的數據

正解:

 1 #include <cstdio>
 2 #include<iostream>
 3
#include <algorithm> 4 using namespace std; 5 const int N=1e5+6; 6 struct activity{ 7 int start,end;//開始,結束時間 8 int xh;//記錄序號 9 }a[N]; 10 int n,ans; 11 int act[1001];//記錄選擇的活動序號 12 int cmp(const activity &a,const activity &b) 13 { 14 return a.end<b.end; 15 } 16 int main()
17 { 18 cin>>n; 19 for(int i=1;i<=n;i++) 20 { 21 cin>>a[i].start>>a[i].end; 22 a[i].xh=i; 23 } 24 sort(a+1,a+n+1,cmp);//按結束時間進行從小到大排序 25 int cur=0,tot=0; 26 for(int i=1;i<=n;i++) 27 if(a[i].start>cur)//選擇結束時間早的活動 28 { 29 cur=a[i].end; 30 ans+=a[i].end-a[i].start+1; 31 act[++tot]=a[i].xh; 32 } 33 cout<<ans<<endl; 34 sort(act+1,act+tot+1); 35 for(int i=1;i<=tot;i++) 36 cout<<act[i]<<" "; 37 return 0; 38 }

CODEVS 2610活動選擇