活動選擇 貪心演算法

2021-10-10 21:48:36 字數 2784 閱讀 7461

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

比如有5個活動,開始與截止時刻分別為:

最佳安排序列為:1,4,5。

input

第一行輸入活動數目n(0

以後輸入n行,分別輸入序號為1到n的活動使用中心的開始時刻a與截止時刻b(a,b為整數且0<=a,b<24,a,b輸入以空格分隔)。

output

輸出最佳安排序列所包含的各個活動(按照活動被安排的次序,兩個活動之間用逗號分隔),如果有多個活動安排序列符合要求輸出字典序最小的序列。

sample input

6810

9161116

1415

1014

711

sample output

1,5

,4

(1)大學生藝術中心在某一時間段內只能舉行乙個社團活動。

(2)活動開始後就不能中斷,因此只能等該活動結束後才能舉行其他的活動。

(1)每乙個社團活動都有三個屬性:開始時刻、結束時刻和活動序號,把它們分別儲存在三個一維陣列中。

(2)按照結束時刻從小到大的順序重新排列活動。(每個結束時刻對應的開始時刻和活動序號不變)為了方便以及符合字典序最小的要求,先將第乙個活動安排進來。從第二個活動開始,比較每個活動的開始時刻與剛剛被安排活動的結束時刻,若前者大於等於後者,則當前這個活動可以被安排進來,標誌符記1;否則,當前活動不能被安排進來,標誌符記0。繼續判斷下乙個活動是否可被安排。

(3)從排序後的第乙個活動開始,若其a[i] = 1,則輸出該活動的序號。

(1)對於樣例中的活動,我們整理得到下面的表:

注:我們給每乙個社團活動乙個具體的名字,如**欣賞等。number[i]表示登記表上第 i 個活動的序號,初始的序號就是正整數遞增序號。

(2)按照結束時刻從小到大的順序重新排列活動,我們得到下面的表:

注:(1)a[i]是登記表中第 i 個活動安排與否的標記符:a[i] = 0表示第 i 個活動不被安排;a[i] = 1表示第 i 個活動被安排。由此可見,a[i]與number[i]是一一對應的,且都是相對於登記表而言的。

(2)這時,我們可以看到登記表上的number[i]發生變化。例如,number[3] = 5 表示登記表上第三個活動是原來序號為3的活動。

(3)根據(2)中的表分析:

① 登記表中的會議先被安排,a[1] = 1,繼續判斷下乙個活動;

② 放映電影的開始時間小於會議的結束時間,該活動不能被安排,置a[2] = 0,繼續判斷下乙個活動;

③ 學術講座b的開始時間等於會議的結束時間,該活動可以被安排,置a[3] = 1,繼續判斷下乙個活動;

④ **答辯a的開始時間等於學術講座b的結束時間,該活動可以被安排,置a[4] = 1,繼續判斷下乙個活動;

⑤ **欣賞的開始時間小於**答辯a的結束時間,該活動不能被安排,置a[5] = 0,繼續判斷下乙個活動;

⑥ **答辯b的開始時間小於**答辯a的結束時間,該活動不能被安排,置a[6] = 0。判斷結束,輸出可以被安排的活動的序號。

#include

using

namespace std;

int n;

//活動數目

int s[

100]

;//s[i]表示活動i的開始時間

int f[

100]

;//f[i]表示活動i的結束時間

int number[

100]

;//number[i]表示」登記表上「第 i 個活動的序號

int a[

100]

;//a[i]是登記表中第 i 個活動安排與否的標記符:a[i] = 0表示第 i 個活動不被安排;a[i] = 1表示第 i 個活動被安排

void

sorttime()

//按照結束時刻從小到大的順序重新排列活動}}

}void

greedyselector()

else

a[i]=0

;//否則,標記符記 0

} cout<

;//輸出符合條件的活動序號

貪心演算法 活動選擇

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

貪心演算法 活動選擇

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

貪心演算法 活動選擇問題

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