poj 2751 雙機排程 johnson演算法

2022-08-04 19:57:16 字數 1438 閱讀 2962

問題就是2臺機器,n件任務,必須先在s1上做,再在s2上做。任務之間先做後做任意。求最早的完工時間。

這是乙個經典問題:2臺機器的情況下有多項式演算法(johnson演算法),3臺或以上的機器是np-hard的。思想就是貪心,時間複雜度是o(nlogn) 。

johnson演算法

(1)    把作業按工序加工時間分成兩個子集,第乙個集合中在s1上做的時間比在s2上少,其它的作業放到第二個集合。先完成第乙個集合裡面的作業,再完成第二個集合裡的作業。

(2)    對於第乙個集合,其中的作業順序是按在s1上的時間的不減排列;對於第二個集合,其中的作業順序是按在s2上的時間的不增排列。

怎麼證呢?

#include

2:

#include

3:

#include

4:

using

namespace std;

5:

const

int maxn = 10005;

6:

struct nodea[maxn],b[maxn],c[maxn];

9:

bool cmp1(const node &p, const node &q)

10:
13:

bool cmp2(const node &p, const node &q)

14:
17:

int n;

18:

int s1sum[maxn];

19:

int sum;

20:

int main()

21:
35:

else

36:
40:         }
41:         sort(b,b+len1,cmp1);                  //子集1作業順序:x不減
42:         sort(c,c+len2,cmp2);                  //子集2作業順序:y不增
43:

for(int i = len1;i44: b[i] = c[i-len1];

45:         s1sum[0] = 0;
46:

for(int i=0;i47: s1sum[i+1] = s1sum[i]+b[i].x;

48:         sum = 0;
49:

for(int i=0;i50:

54:         printf("%d\n",sum);
55:     }
56: }

poj 2751 貪心(雙機排程)

題意 現在有2臺機器,n件任務,每件任務必須先在機器1上做,做完之後再在機器2上做,各任務之間的加工順序任意。給出每件任務在兩個機器上做的時間,求最早的完工時間.思路 參考的cmp函式 return x.a max y.a,x.b y.b另一種思路 1 把作業按工序加工時間分成兩個子集,第乙個集合中...

1394雙機除錯的問題

我原來用串列埠除錯,速度很慢,現在買了乙個1394卡,結果雙機除錯總是連不上,請各位大俠教教我啊。具體情況是,筆記本原生1394,4針小口,台式電腦買了乙個via 1394 pci e卡插上,可以正確識別。台式電腦是大口6針1394介面,用4轉6的線盒筆記本連線。xp下面,系統自動安裝1394 網絡...

wdk7 雙機環境設定

通過上面的blog,我們已經可以編譯出xp下的驅動 sys 檔案了。下面如何除錯執行呢。參考了寒江獨釣的前輩書籍中的資料和網上的資料,需要注意的有幾點 1.虛擬機器的串列埠務必保證com1 或者和虛擬機器裡面的作業系統的除錯串列埠一致 2.確保虛擬機器是按照debug 模式啟動的,因為虛擬機器預設作...