課程排程問題

2021-08-15 12:38:15 字數 1490 閱讀 4940

網易雲課堂  

演算法設計與分析之入門篇 貪心演算法 作業3

題目內容: 

有 n 個人,要完成 2 門課程。其中第 i 個人學習一門課程所需要的時間是 ti。 

每個人同一時刻只能修一門課程,每門課程同一時刻只能被乙個人修,中間不能中斷。 

問所有人都修完 2 門課程,至少需要多少時間。

輸入格式: 

輸入的第一行包含乙個整數 n(1 <= n <= 1000000)。 

接下來的一行包含 n 個整數 (1 <= ai <= 1000000000),表示每門課程的時間。

輸出格式: 

輸出一行表示對應的答案。

輸入樣例: 

3 2 2 2 

3 4 1 2 

4 1 3 2 1 

輸出樣例: 

6 8 

7 時間限制:2000ms記憶體限制:128000kb

題目分析:

理解一下題意,說的是把兩個1<=i<=n中的元素分別排好,並且不能重疊。

這個問題難在如何找到乙個好的策略來排程,只要找到這樣乙個排程策略,證明它是總時間最少的策略就可以了,**部分並不難。

為討論方便,我們假設a1<=...<=ai<=...<=an

顯然,我們最希望看到的解是所有ai的和。在這種情況下,所有的課程都沒有重疊。我們可以看看重疊的情況,亦即樣例2:

4444221_

221_4444

由於重疊,第二行的課程4必須往後挪一位,導致總時間增加。為減少重疊,我採用了以下的策略:

an       a(n-1) a(n-2) ... a2 a1

a(n-1) a(n-2)            ... a1 an

假設從0開始計數,所以上面一行ai(ia(n-1)+...+ai ,由於ai<=a(i+1)  (i通過迴圈移動一位,我發現整個策略裡唯一可能重疊的課程就是最大的an了。當 2 * an <= an +...+a1 時,an不重疊,所有的課程都不重疊,最小的總時間為所有課程時間之和;否則,an重疊,最小的總時間為2 * an 。

回到實現部分,我們只需要遍歷一下陣列,找到最大的元素,同時求出最大值,比較最大值的兩倍和所有元素之和就可以了。同時注意一下給的數有可能會溢位,選大一點的long long就行了。

#include #include #include using namespace std;

typedef unsigned int uint_32;

typedef unsigned long long uint_64;

uint_64 getmincoursetime(vector& courses)

return 2*maxnum>sum?2*maxnum:sum;

}int main()

cout << getmincoursetime(scores) << "\r\n";

system("pause");

return 0;

}

教室課程排程問題的兩種解法(區間著色問題)

問題描述 假如要用很多個教室對一組課程進行排程,每節課程都有其開始時間和結束時間,我們希望使用盡量少的時間來排程所有的課程,請給出排程演算法?分析 1 利用貪心演算法來解決這個問題。1 將課程按照其結束時間的先後順序排序。2 設課程集合為c,我們可以利用貪心演算法先求出初始課程集合c的乙個最大相容課...

排程機任務排程問題

題目描述 假設有乙個 排程機,有n個任務相同的任務需要排程到m臺伺服器上執行,由於每台伺服器的配置不一樣,因此,伺服器執行乙個任務所花費的時間也不同。現在假設第i個伺服器執行乙個任務需要的時間為t i 假如,有2個執行機a與b,執行乙個任務分別需要7min和10min,有6個任務待排程。如果平分這6...

車站排程問題

題目描述 有順序排列的1,2,3,n節車廂在入站口等待排程。車站設定了乙個棧作為緩衝,這樣的話只可能進行下列兩個操作之一 1 如果還有車廂在入站口,將最前面的入棧緩衝 2 將棧頂的車廂駛出車站 給定乙個1至n的排列,問其作為出站序列是否合法。注意 入站順序為1,2,3,n,即1先入棧.n最後入棧。輸...