貪心演算法 活動選擇

2021-08-07 09:44:30 字數 860 閱讀 4449

假設有乙個需要使用某一資源的活動組成的集合s,s=.(n<1000)該資源一次只能被乙個活動占用,每乙個活動有乙個開始時間bi和乙個結束事件ei(bi <=ei).若bi >=ej或者bj >=ei,則活動i和活動j相容。 你的任務是:選擇由相互相容的活動組成的最大集合。 輸入:

輸入共n+1行,其中第1行為n,第2行到第n+1行表示n個活動的開始時間和結束事件。(中間用空格隔開。)格式為 n b1 e1 …… bn en

輸出共兩行,第一行為滿足要求的活動所占用的總時間t。(可以理解為選擇的活動中最後乙個活動的結束時間) 第二行為最大集合中的活動序號。每個資料見用乙個空格隔開。

這道題可以用動態規劃和貪心做,我介紹的演算法為貪心

假設有兩個區間x,y,區間x完全包含y,那麼顯然x和y之中只能取乙個,且取y比較划算。這就是此題的貪心策略,我們先按結束時間把每個事件排序,現在如果有任何乙個事件的開始時間小於前面任何乙個事件的開始時間,那麼這個事件就會被捨棄。經過這些操作以後,這道題就變成了乙個簡單的區間合併,直接逐個判斷後放入。

具體見以下**和每乙個細節的注釋

#include#include#includeusing namespace std;

struct nnn//運用結構體的目的是方便交換活動序號--f

s[1005];

int comp(nnn x,nnn y)

for(int i=1;i<=n;i++)

}printf("%d\n",m);

sort(an+1,an+ml+1);//從小到大排序後輸出

for(int i=1;iprintf("%d ",an[i]);

printf("%d",an[ml]);

}

貪心演算法 活動選擇

貪心演算法,選擇區域性最優解 活動選擇問題,每個活動有開始時間s,結束時間f,找到最大相容活動集。假設f按照大小順序排好。每次就從當前結束時間往後選最近的開始時間的活動 include include include using namespace std void activityselect m...

活動選擇 貪心演算法

學校的大學生藝術中心週日將面向全校各個學院的學生社團開放,但活動中心同時只能供乙個社團活動使用,並且每乙個社團活動開始後都不能中斷。現在各個社團都提交了他們使用該中心的活動計畫 即活動的開始時刻和截止時刻 請設計乙個演算法來找到乙個最佳的分配序列,以能夠在大學生藝術中心安排不衝突的盡可能多的社團活動...

貪心演算法 活動選擇問題

活動選擇問題 就是給定一組活動的開始時間和結束時間,然後他們都需要使用到乙個資源,這個資源每次只有乙個活動可以用,要求求出乙個最大的相互相容的活動子集。首先定義了乙個集合sij 其中s就是所有活動的集合,fi是活動ai的完成時間si是活動ai的開始時間。這道題如果是用dp來解的話,就需要找到最優解的...