活動選擇問題 貪心

2021-10-04 21:07:23 字數 1363 閱讀 8461

排程共享資源的多個活動,目標是選出乙個最大的互相相容的活動集合。

有乙個n個活動的集合 s = ,每個活動都有乙個開始時間si、結束時間fi。時間段不相互重疊的活動是互相相容的,選出乙個最大的相容活動子集。

定理1:考慮任意非空子問題

首先要將每個活動的時間段按照結束時間(增序)排序。直觀上,我們每次應該選擇這樣乙個活動,選出它後剩下的資源應該能被盡量多的其他任務所用。故得出貪心選擇:每次選擇能與子集相容的、最早結束的活動,加入子集。由定理1知:這樣的結果必然是乙個最大相容活動子集(不唯一)。

1、遞迴實現

#define maxn

bool isselected[maxn] = ; //標記是否加入最終的子集

/* 開始時間與結束時間對應儲存在陣列s、f中(已經按結束時間增序排序好)

* 在第 k + 1 ~ n個活動間選擇:子問題大小為 sk

* 選取結果儲存在 isselected 陣列中*/

void recursiveactivityselector(int s, int f, int k, int n)

}

2、遞推實現 

#define maxn

bool isselected[maxn] = ; //標記是否加入最終的子集

/* 開始時間與結束時間對應儲存在陣列s、f中(已經按結束時間增序排序好)

* 活動個數為 n

* 選取結果儲存在 isselected 陣列中 */

void greedyactivityselector(int s, int f, int n) }}

有乙個n個活動的集合 s = ,每個活動都有乙個開始時間si、結束時間fi。我們需要將它們安排到一些教室,請問最少需要多少個教室?

思路1:貪心演算法此題就是上面問題的拓展,可以在 s 內選出乙個最大相容活動子集(相當於將他們分配到一間教室),然後再將這些選擇出的活動在 s 中除去,繼續選擇...直到 s 內活動全都選擇完,看分配了多少間教室即可。

思路2:模擬演算法

直接模擬教室的使用情況:將開始時間s與結束時間f放在一起增序排序,且結束時間優先順序更高(當時間相同時,結束時間排在開始時間的前面)。依次遍歷這個排序好的時間點,遇到開始時間就classroom++,遇到結束時間就classroom--。中間維護乙個max_classroom,記錄classroom出現的最大值,即是最終的答案。

活動選擇問題(貪心)

time limit 1000ms memory limit 65536k 有疑問?點這裡 學校的大學生藝術中心週日將面向全校各個學院的學生社團開放,但活動中心同時只能供乙個社團活動使用,並且每乙個社團活動開始後都不能中斷。現在各個社團都提交了他們使用該中心的活動計畫 即活動的開始時刻和截止時刻 請...

貪心 活動選擇問題

time limit 1000ms memory limit 65536kb submit statistic problem description sdut 大學生藝術中心每天都有n個活動申請舉辦,但是為了舉辦更多的活動,必須要放棄一些活動,求出每天最多能舉辦多少活動。input 輸入包括多組輸...

貪心 活動選擇問題 OJ

sdut 大學生藝術中心每天都有n個活動申請舉辦,但是為了舉辦更多的活動,必須要放棄一些活動,求出每天最多能舉辦多少活動。輸入包括多組輸入,每組輸入第一行為申請的活動數n,從第2行到n 1行,每行兩個數,是每個活動的開始時間b,結束時間e 輸出每天最多能舉辦的活動數。12 15 20 15 19 8...