日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

会场安排问题

發布時間:2025/3/21 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 会场安排问题 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

問題描述:

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

來換一個描述

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

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

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

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

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

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

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

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

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

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

數據輸入

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

由于問題定義上有些紕漏,但通常,我們認為如果上一個活動在t時間結束,下一個活動最早應該在t+1時間開始(上述問題有一定出入)

代碼實現

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

private static int meeting_problem(int[] startTime,int[] endTime){//一組活動數據的最優解int maxresult = 1;//冒泡排序,對startTime和endTime數據進行排序for (int i = 0; i < endTime.length-1; i++) {boolean canBreak = true;for (int j = 1; j < endTime.length - i; j++) {if (endTime[j-1] > endTime[j]) {int temp = endTime[j - 1];endTime[j-1] = endTime[j];endTime[j] = temp;int temp2 = startTime[j - 1];startTime[j-1] = startTime[j];startTime[j] = temp2;canBreak = false;}}if (canBreak) {break;}}// 記錄上一次活動的結束時間int key = endTime[0];for (int i = 1; i < endTime.length; i++) {// 如果活動的開始時間能夠大于上一次活動的結束時間if (startTime[i] - key >= 1){//計數+1maxresult ++;//保存結束時間key = endTime[i];}}return maxresult; }

結合輸入的代碼:

public static void main(String[] args) {Scanner scanner = new Scanner(System.in);int num = scanner.nextInt();int[] results = new int[num];for (int i = 0; i < num; i++) {int a = scanner.nextInt();int[] startTimes = new int[a];int[] endTimes = new int[a];for (int j = 0; j < a; j++) {startTimes[j] = scanner.nextInt();endTimes[j] = scanner.nextInt();}results[i] = (meeting_problem(startTimes, endTimes));}for (Integer result:results) {System.out.println(result);} }

這里直接引用了 黑白咖 的文章:http://www.jianshu.com/p/0ce92abe862d 中的代碼。

另外一種思路

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

歡迎轉載,轉載請注明出處!
簡書ID:@我沒有三顆心臟



作者:我沒有三顆心臟
鏈接:https://www.jianshu.com/p/a4a2668f5ce5
來源:簡書
著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。

總結

以上是生活随笔為你收集整理的会场安排问题的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。