問題描述:
假設要在足夠多的會場裡安排一批活動,並希望使用盡可能少的會場。設計乙個有效的貪心演算法進行安排(這個問題實際上是著名的圖著色問題。若將每乙個活動作為圖的乙個頂點,不相容活動間用邊相連。使相鄰頂點著有不同顏色的最小著色數,相應於要找的最小會場數)。
對於k個待安排的活動,計算使用最少會場的時間表。
input.txt
5 1 23
12 28
25 35
27 80
36 50
output.txt
3先簡單描述我的思路,可能很多人剛開始和我的思路一樣,最終**很醜,不過還是簡單敘述一下思路,首先從第乙個開始的活動出發,根據該活動的結束時間找到在這個時間之後的第乙個活動的開始時間,然後從這個新活動出發再去尋找下乙個第乙個出現的相容的活動,依次類推,結束第一次遍歷,可以找到乙個會場的所有活動,這些活動標記一下,下次不再遍歷。開啟下次遍歷,再找出乙個新的會場的所有的活動,直到所有的活動找到會場為止。**如下,只可以做參考(太醜)。
1 #include2下面是書上的參考**,很精簡,**稍微有點不是好理解,但是思路和我的方法基本一致using
namespace
std;
3#define m 100
4int
array1[m];
5int
array2[m];
6void arange(int array1[m],int array2[m],int
n)24
if(array2[i]0)30}
31}32 maxnum++;//
會場的數目加一
33if(counts==n)36}
37 cout <
39int
main()
4048
intarray3[n];
49int
array4[n];
50 memset(array3,0,sizeof(array3));//
儲存排序後的活動的起始點
51 memset(array4,0,sizeof(array4));//
儲存排序後的活動的終止時間點
52for(int i=0;i//
複製一下起始時間,
53 array3[i]=array1[i];54}
55 sort(array3,array3+n);//
所有的活動根據起始時間進行排序用array3和array4進行儲存
56for(int i=0;i)62}
63}64arange(array3,array4,n);
65 }
具體的思路是:看一活動的開始時間是否大於某一會場的結束時間,如果是就加入該會場中,並更新該會場的結束時間,(如果有多個會場選擇的話,就選最優的那乙個,即結束時間最小的)
,如果所有的會場都不滿足,則再新增乙個會場,把該活動的結束時間賦予這個新增的會場。
演算法的時間複雜度: 設有 n 個活動,使用了k(k<=n)個會場,則時間複雜度為 o(n(k+nlogn))
1 #include 2 #include 3 #include 4using
namespace
std;
5struct
point6;
10bool cmp(point x,point y)//
比較時間點的大小
1114
15int greedy(vectorx)
16
28return
max; 29}
3031
intmain()
3247 cout
48 x.clear();//
clear只是把那些元素全部刪除掉,並不是釋放記憶體49}
會場安排問題
會場安排問題 問題描述 假設要在足夠多的會場裡安排一批活動,活動的開始時間和結束時間已知,並希望使用盡可能少的會場。設計乙個有效的演算法進行安排。分析 這個問題實際上是著名的圖著色問題。若將每乙個活動作為圖的乙個頂點,不相容活動間用邊相連。使相鄰頂點著有不同顏色的最小著色數,就對應要找的最小會場數。...
會場安排問題
時間限制 3000 ms 記憶體限制 65535 kb 難度 4 描述 學校的小禮堂每天都會有許多活動,有時間這些活動的計畫時間會發生衝突,需要選擇出一些活動進行舉辦。小劉的工作就是安排學校小禮堂的活動,每個時間最多安排乙個活動。現在小劉有一些活動計畫的時間表,他想盡可能的安排更多的活動,請問他該如...
會場安排問題
時間限制 3000 ms 記憶體限制 65535 kb 難度 4 描述 學校的小禮堂每天都會有許多活動,有時間這些活動的計畫時間會發生衝突,需要選擇出一些活動進行舉辦。小劉的工作就是安排學校小禮堂的活動,每個時間最多安排乙個活動。現在小劉有一些活動計畫的時間表,他想盡可能的安排更多的活動,請問他該如...