假設要在足夠多的會場裡安排一批活動,並希望使用盡可能少的會場。設計乙個有效的 貪心演算法進行安排。(這個問題實際上是著名的圖著色問題。若將每乙個活動作為圖的乙個 頂點,不相容活動間用邊相連。使相鄰頂點著有不同顏色的最小著色數,相應於要找的最小 會場數。)
第一行有 1 個正整數k,表示有 k個待安排的活動。 接下來的 k行中,每行有 2個正整數,分別表示 k個待安排的活動開始時間和結束時間。時間 以 0 點開始的分鐘計。
輸出最少會場數。
51231228
2535
2780
3650
3錯誤解法:
按照結束時間排序,然後開始放活動,這樣貪心可以使每次放的活動最多。
這樣做是錯的,這樣只能保證第一次放的活動是最多的,但是具備有後效性,不能使全域性最優。網上的很多解法都是這個,是錯誤的。
比如資料:
6這組資料的答案是3,我們把活動按照1-n編號,那麼分別用三個會場裝(2, 6)、(4, 5)、(3, 1),就能完成任務,答案是3。90 98---1
8 32----2
18 48---3
16 82---4
83 84---5
39 89---6
但是如果按照貪心排結束時間的做法,答案是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 描述 學校的小禮堂每天都會有許多活動,有時間這些活動的計畫時間會發生衝突,需要選擇出一些活動進行舉辦。小劉的工作就是安排學校小禮堂的活動,每個時間最多安排乙個活動。現在小劉有一些活動計畫的時間表,他想盡可能的安排更多的活動,請問他該如...