會場安排問題(貪心法)

2021-08-17 00:05:42 字數 1906 閱讀 9786

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

為了能夠更加生動說明問題的整個過程,所以換乙個類似的描述來契合《演算法**》一書中的描述。

你沒法讓這些課都在這間教室上,因為有些課的上課時間有衝突。

你希望這間教室上盡可能多的課。如何選出盡可能多且時間不衝突的課程呢?

這個問題似乎很難,但演算法卻簡單得讓人吃驚。具體做法如下:

- ①選出結束最早的課,它就是要在這間教室上的第一堂課。

- ②接下來,必須選擇第一堂課結束後才開始的課。同樣,你選擇結束最早的課,這將是要在這間教室上的第二堂課。

重複這樣做就能找出答案!下面來試一試。美術課的結束時間最早,為10:00 a.m,因此它就是第一堂課。

接下來的課必須在10:00 a.m後開始,且結束得最早。

英語課不行,因為它的時間與美術課衝突,但數學課滿足條件。最後,計算機課與數學課的時間是衝突的,但**課可以。

因此將在這間教室上如下三堂課。

貪婪演算法很簡單:每步都採取最優的做法。在這個示例中,你每次都選擇結束最早的課。用專業術語說,就是你每步都選擇區域性最優解,最終得到的就是全域性最優解。聽上去有些神奇,但對於這個排程問題上,上述的簡單演算法找到的就是最優解。

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

考慮到使用者輸入並不會按照開始的時間或者結束的時間嚴格輸入,所以我們自己或許要加乙個排序演算法,這對我們自己遍歷也會提供方便:

private

static

intmeeting_problem(int starttime,int endtime)

}if (canbreak)

}// 記錄上一次活動的結束時間

int key = endtime[0];

for (int i = 1; i < endtime.length; i++)

}return maxresult;

}

結合輸入的**:

public

static

void

main(string args)

results[i] = (meeting_problem(starttimes, endtimes));

}for (integer result:results)

}

這裡直接引用了黑白咖的文章: 中的**。

我們也可以通過找最大重疊數來完成,這裡不符合貪心策略,所以就不作深入研究。

會場安排問題 貪心

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

貪心 會場安排問題

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

貪心策略 會場安排問題

假設要在足夠多的會場裡安排一批活動,並希望使用盡可能少的會場。設計乙個有效的貪心演算法來進行安排。試程式設計實現對於給定的 k 個待安排活動,計算使用的最少會場。輸入資料中,第一行是 k 的值,接下來的 k 行中,每行有 2 個正整數,分別表示 k 個待安排活動的開始時間和結束時間,時間以 0 點開...