hdu2037node
本題使用貪心。有三種貪心策略:開始時間最先,結束時間最先,用時最短。第二種是正確的策略,由於結束得越早,後面就能夠有越多節目被看。
我使用了優先隊列進行排序,以結束時間數值小的爲高優先級。
c++代碼以下:ios
#include<iostream> #include<queue> using namespace std; struct node{ int Beg; int End; friend bool operator<(node n1,node n2){ return n1.End>n2.End;//End小的優先級高 } }TV; int main() { int n;//節目總數 int count;//最多能夠看完的節目總數 int last_end; while(~scanf("%d",&n)&&n){ priority_queue<node>chn; while(n--){ scanf("%d%d",&TV.Beg,&TV.End); chn.push(TV); } count=1;//能夠看完第一個節目 last_end=chn.top().End;//第一個看完的節目的結束時間 /*while(!chn.empty()){ printf("%d %d\n",chn.top().Beg,chn.top().End); chn.pop(); }*/ while(1){ if(chn.empty()) break; if(chn.top().Beg>=last_end){//能夠看這個節目 count++; last_end=chn.top().End; chn.pop(); } else{//不能看這個節目 chn.pop(); } } printf("%d\n",count); } }
貪心法思想:
走一步看一步,並且只看一步;
在每一步,選當前最優的;
不回頭,不改變已有的選擇。
貪心法只根據當前已有的信息作出選擇,並且一旦作出了選擇,無論未來有什麼結果,這個選擇都不會改變。換言之,貪心法並非從總體最優考慮,它所作出的選擇只是在某種意義上的局部最優。
這種局部最優選擇並不總能得到總體最優解(Optimal Solution),但一般能得到近似最優解(Near-Optimal Solution)。c++