【NOJ1205】【貪心演算法】活動安排
阿新 • • 發佈:2018-12-13
1205.活動安排
時限:1000ms 記憶體限制:10000K 總時限:3000ms
描述
Jack是一名nwpu的大一新生,對學校舉辦的各種活動都十分的好奇,想盡可能多的參加這些活動。Npwu每天共有N項活動,其開始結束時間分別為B[i],E[i],(i = 1,2,……N) 請問Jack一天最多能參加幾項活動。當然,Jack在同一時間內只能參加一項活動,即jack參加的活動時間上不能重疊,但時間為[t1,t2],[t2,t3]的兩個活動是可以同時參加的。
輸入
第一行 一個整數N(1<=n<=1000)表示活動總數。 接下來N行表示各活動的起始,結束時間0<=B[i]<E[i]<24
輸出
一個整數表示Jack最多能參加的活動數目。
#include <iostream> using namespace std; //貪心演算法 int n; int b[1001]; int e[1001]; int endcur; //當前已參加活動的結束時間,簡稱當前結束時間 int cnt; //當前已參加活動的數目 int main() { //輸入資料 cin>>n; for(int i=0; i<n; i++) { cin>>b[i]>>e[i]; } //按結束時間遞增排序 for(int i=0; i<n; i++) { for(int j=i; j<n; j++) { if(e[j]<e[i]) { swap(e[i],e[j]); swap(b[i],b[j]); } } } //貪心演算法,按結束時間遞增順序遍歷所有活動 //只要能參加的都參加 endcur=e[0]; //先參加第一個活動 cnt=1; for(int i=1; i<n; i++) { if(b[i]>=endcur) //如果第i個活動開始時間,比當前結束時間晚/相同 { cnt++; //這個活動可以參加 endcur=e[i]; //更新一下當前結束時間 } else //參加不了就換下一個 { continue; } } cout<<cnt<<endl; return 0; }
【後記】
1.做這道題的時候,突然想起上個假期吭哧吭哧刷杭電oj的自己,那時候只自學了一點點資料結構,還沒學演算法,也完全沒寫過C++,憑著自己並不聰明的腦子硬AC出來六十來道題,印象最深的就是卡在了這道題上。現在一看,當初自己稚嫩的想法其實就是貪心演算法的思想,而這道題實在是太簡單了。想當初的當初,學C語言的時候,天天發愁記不住氣泡排序,現在隨手即來了。
2.越想越勵志,敬大三轉專業的自己。