CODEVS 2610活動選擇
阿新 • • 發佈:2017-05-07
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 Input11
3 5
1 4
12 14
8 12
0 6
8 11
6 10
5 7
3 8
5 9
2 13
樣例輸出 Sample Output14
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活動選擇