hdu2037 今年暑假不AC[貪心][區間調度問題]

題目地址

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++

  • 貪心法求解的問題的特徵:
    1)最優子結構性質
    當一個問題的最優解包含其子問題的最優解時,稱此問題具備最優子結構性質,也稱此問題知足最優性原理。
    2)貪心選擇性質
    所謂貪心選擇性質是指問題的總體最優解能夠經過一系列局部最優的選擇,即貪心選擇來獲得。
  • 動態規劃法一般以自底向上的方式求解各個子問題,而貪心法則一般以自頂向下的方式作出一系列的貪心選擇。
相關文章
相關標籤/搜索