排程共享資源的多個活動,目標是選出乙個最大的互相相容的活動集合。記有乙個n個活動的集合 s = ,每個活動都有乙個開始時間si、結束時間fi。時間段不相互重疊的活動是互相相容的,選出乙個最大的相容活動子集。
定理1:考慮任意非空子問題首先要將每個活動的時間段按照結束時間(增序)排序。直觀上,我們每次應該選擇這樣乙個活動,選出它後剩下的資源應該能被盡量多的其他任務所用。故得出貪心選擇:每次選擇能與子集相容的、最早結束的活動,加入子集。由定理1知:這樣的結果必然是乙個最大相容活動子集(不唯一)。
1、遞迴實現
2、遞推實現#define maxn
bool isselected[maxn] = ; //標記是否加入最終的子集
/* 開始時間與結束時間對應儲存在陣列s、f中(已經按結束時間增序排序好)
* 在第 k + 1 ~ n個活動間選擇:子問題大小為 sk
* 選取結果儲存在 isselected 陣列中*/
void recursiveactivityselector(int s, int f, int k, int n)
}
#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...