7 2 會場安排問題 20分

2022-07-12 03:24:11 字數 2005 閱讀 1606

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

第一行有 1 個正整數k,表示有 k個待安排的活動。 接下來的 k行中,每行有 2個正整數,分別表示 k個待安排的活動開始時間和結束時間。時間 以 0 點開始的分鐘計。

輸出最少會場數。

5123

1228

2535

2780

3650

3
錯誤解法:

按照結束時間排序,然後開始放活動,這樣貪心可以使每次放的活動最多。

這樣做是錯的,這樣只能保證第一次放的活動是最多的,但是具備有後效性,不能使全域性最優。網上的很多解法都是這個,是錯誤的。

比如資料:

6

90 98---1

8 32----2

18 48---3

16 82---4

83 84---5

39 89---6

這組資料的答案是3,我們把活動按照1-n編號,那麼分別用三個會場裝(2, 6)、(4, 5)、(3, 1),就能完成任務,答案是3。

但是如果按照貪心排結束時間的做法,答案是4,在第一次拿的時候我們拿了很多,3個,但是這也導致後面的活動都不得不單獨開乙個會場,導致答案為4,不是最優解。這也就是典型的區域性最優不能帶來全域性最優。

附上錯誤**:

#include using

namespace

std;

typedef

struct

event;

intmain()

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

}swap(

event[i],event

[min_id]);

}int room[k+1]=; //

會場,room[i]記錄活動結束的時間,即表示第i個會場開始空閒的時間

//初始化為0,表示未使用,若不是0則代表該會場已經被使用過

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

}

}int count=0; //

統計room陣列非0單元個數,即最小使用數

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

cout

}

稍微改一下就好

正確**:

#include using

namespace

std;

typedef

struct

event;

intmain()

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

}swap(

event[i],event

[min_id]);

}int room[k+1]=; //

會場,room[i]記錄活動結束的時間,即表示第i個會場開始空閒的時間

//初始化為0,表示未使用,若不是0則代表該會場已經被使用過

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

}

}int count=0; //

統計room陣列非0單元個數,即最小使用數

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

cout

}

下圖重疊的地方表示活動之間不相容,即不能在同一會場進行

最大重疊數 = 最小會場數

會場安排問題

會場安排問題 問題描述 假設要在足夠多的會場裡安排一批活動,活動的開始時間和結束時間已知,並希望使用盡可能少的會場。設計乙個有效的演算法進行安排。分析 這個問題實際上是著名的圖著色問題。若將每乙個活動作為圖的乙個頂點,不相容活動間用邊相連。使相鄰頂點著有不同顏色的最小著色數,就對應要找的最小會場數。...

會場安排問題

時間限制 3000 ms 記憶體限制 65535 kb 難度 4 描述 學校的小禮堂每天都會有許多活動,有時間這些活動的計畫時間會發生衝突,需要選擇出一些活動進行舉辦。小劉的工作就是安排學校小禮堂的活動,每個時間最多安排乙個活動。現在小劉有一些活動計畫的時間表,他想盡可能的安排更多的活動,請問他該如...

會場安排問題

時間限制 3000 ms 記憶體限制 65535 kb 難度 4 描述 學校的小禮堂每天都會有許多活動,有時間這些活動的計畫時間會發生衝突,需要選擇出一些活動進行舉辦。小劉的工作就是安排學校小禮堂的活動,每個時間最多安排乙個活動。現在小劉有一些活動計畫的時間表,他想盡可能的安排更多的活動,請問他該如...