貪心演算法 會場問題

2021-09-24 16:56:28 字數 1826 閱讀 5431

在題目之前要知道貪心演算法的基本步驟與實現過程

(1)貪心法的基本思路:

——從問題的某乙個初始解出發逐步逼近給定的目標,以盡可能快的地求得更好的解。當達到某演算法中的某一步不能再繼續前進時,演算法停止。

該演算法存在問題:

不能保證求得的最後解是最佳的;

不能用來求最大或最小解問題;

只能求滿足某些約束條件的可行解的範圍

(2)實現該演算法的過程:

從問題的某一初始解出發;

while 能朝給定總目標前進一步 do

求出可行解的乙個解元素;

由所有解元素組合成問題的乙個可行解;

會場安排問題

一、問題描述

假設要在足夠多的會場裡安排一批活動,並希望使用盡可能少的會場。設計乙個有效地貪心演算法進行安排(這個問題實際上是著名的圖著色問題。若將每乙個活動作為圖的乙個頂點,不相容的活動間用直線連線。使相鄰點有著不同顏色的最小著色數,相應於要找的最小會場數)

二、演算法分析

第一種:簡易解法:我們將給的開始時間和結束時間進行排序,混排,得到乙個陣列,然後對應這個陣列生成乙個b陣列,裡面存放的是各個時間分別是開始時間還是結束時間,然後再建立乙個c陣列來儲存會場的個數,遇到b陣列中s就count++,遇到b陣列中f就count–,然後再在c陣列中找出最大值就是會場的個數!

第二種:貪心演算法:我們將開始的時間和結束的時間分別放進兩個陣列裡面,開始的時間是非遞減序列,開始陣列與結束陣列一一對應,建立乙個空的陣列來進行排的過程,陣列初始化為0,用開始陣列裡的資料和a陣列進行比較,如果開始的陣列中的數字大於a陣列中的數字則表示上個活動在這個場地已經結束可以繼續將下乙個活動放入,反之的話就是,在排這個活動的時候上乙個還沒有結束,只能放到下乙個演出廳中了,即a陣列加乙個數,如此迴圈,知道把開始時間的陣列遍歷完成,看a陣列的長度或者每當加入時num加一,最後統計num即為個數!

三、具體過程

(1)混排

1 12 23 25 27 28 35 36 50 80

s s f s s f f s f f

1 2 1 2 3 2 1 2 1 0

最大值為3

(2)s 1 12 25 27 36

f 23 28 35 80 50

a 23 28

35 28 80

35 50 80

看a的個數,只需要三個會場!

四、核心函式

for(i=2;i<=n;i++)

}

五、測試資料與結果

測試資料:5

1 23

12 28

25 35

27 80

36 50

測試結果:

六、**

#include"stdio.h"

int main()

a[1]=f[1];

num=1;

for(i=2;i<=n;i++)

}

if(flag == 1)

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

for(k=1;k<=num;k++)

printf("%d ",a[k]);

printf("\n");

printf("**********====");

printf("\n");

printf("%d\n",num);

return 0;

}

會場安排問題 貪心演算法

描述 學校的小禮堂每天都會有許多活動,有時間這些活動的計畫時間會發生衝突,需要選擇出一些活動進行舉辦。小劉的工作就是安排學校小禮堂的活動,每個時間最多安排乙個活動。現在小劉有一些活動計畫的時間表,他想盡可能的安排更多的活動,請問他該如何安排。輸入 第一行是乙個整型數m m 100 表示共有m組測試資...

貪心演算法 會議安排

題目描述 在大公司裡,會議是很多的,開會得有場子,要場子你得先在電子流裡預訂。如果你是專案組新來的小弟,那麼恭喜你,每天搶訂會議室的任務就光榮的分給你了。老大要求你盡可能多的訂會議室,但是這些會議室之間不能有時間衝突。input input檔案中可以包括多個測試案例。t t 20 輸入檔案的第一行表...

貪心演算法 會議室問題

有一堆會議,每個會議都有開始時間和結束時間,問至少需要幾個房間可以安排下這些會議?解決思路 這是個貪心類問題,每個會議都有結束時間和開始時間,可以對兩個時間分開儲存並排序,從最先開始的會議開始遍歷,只要當前會議的開始時間小於結束時間陣列中的第乙個結束時間,就需要重新開闢乙個房間。接著看下乙個會議的開...