貪心之多機排程問題

2021-08-02 12:02:31 字數 2540 閱讀 1403

題目來自洛谷1190

學校裡有乙個水房,水房裡一共裝有 m 個龍頭可供同學們開啟水,每個龍頭每秒鐘的

供水量相等,均為 1。

現在有 n 名同學準備接水,他們的初始接水順序已經確定。將這些同學按接水順序從 1到 n 編號,i 號同學的接水量為 wi。接水開始時,1 到 m 號同學各佔乙個水龍頭,並同時開啟水龍頭接水。當其中某名同學 j 完成其接水量要求 wj後,下一名排隊等候接水的同學 k馬上接替 j 同學的位置開始接水。這個換人的過程是瞬間完成的,且沒有任何水的浪費。即j 同學第 x 秒結束時完成接水,則 k 同學第 x+1 秒立刻開始接水。若當前接水人數 n』不足 m,則只有 n』個龍頭供水,其它 m−n』個龍頭關閉。

現在給出 n 名同學的接水量,按照上述接水規則,問所有同學都接完水需要多少秒。

輸入格式:

輸入檔名為 water.in。

第 1 行 2 個整數 n 和 m,用乙個空格隔開,分別表示接水人數和龍頭個數。

第 2 行 n 個整數 w1、w2、……、wn,每兩個整數之間用乙個空格隔開,wi表示 i 號同

學的接水量。

輸出格式:

輸出檔名為 water.out。

輸出只有一行,1 個整數,表示接水所需的總時間。

這個問題是np完全問題,還沒有有效的解法(求最優解),但是可以用貪心選擇策略設計出較好的近似演算法(求次優解)。當n<=m時,只要將作業時間區間分配給作業即可;當n>m時,首先將n個作業從大到小排序,然後依此順序將作業分配給空閒的處理機。也就是說從剩下的作業中,選擇需要處理時間最長的,然後依次選擇處理時間次長的,直到所有的作業全部處理完畢,或者機器不能再處理其他作業為止。如果我們每次是將需要處理時間最短的作業分配給空閒的機器,那麼可能就會出現其它所有作業都處理完了只剩所需時間最長的作業在處理的情況,這樣勢必效率較低。在下面的**中沒有討論n和m的大小關係,把這兩種情況合二為一了。

但是這一題中因為已經確定了接水順序,所以省去了排序。

#include

#include

#include

#include

using

namespace

std;

int n,m,wi[100001],mac[1000001];

bool cmp(const

int &x,const

int &y)

int main()

cout

<<*max_element(mac,mac+m);

return

0;}

以上**的好處是簡潔,壞處就是時間複雜度較高。一樣的題目放在codevs上就過不去。可以用優先佇列優化

(這一題需要排序)

#include

#include

#include

#include

#include

#include

using

namespace

std;

int wi[1000001];

bool cmp(const

int &x,const

int &y)

int main()

else left=n-m;

for(int i=1;i<=m;i++)

for(int i=1;i<=left;i++)

int ans;

while( !q.empty() )

cout

0;}

或者用線段樹優化:

#include

#include

#include

#include

#include

using namespace std;

int n,m,wi[1000001],tree[100001

*4],maxx=-1;

bool cmp(const int &x,const int &y)

void build(int node,int l,int r)

intm=(l+r)/2;

build(node*2,l,m);

build(node*2+1,m+1,r);

tree[node]=min(tree[node*2],tree[node*2+1]);

}void update(int node,int l,int r,int w)

intm=(l+r)/2;

if(tree[node] == tree[node*2]) update(node*2,l,m,w);

else update(node*2+1,m+1,r,w);

tree[node]=min(tree[node*2],tree[node*2+1]);

}int main()

sort(wi+1,wi+n+1,cmp);

//for(int i=1;i<=n;i++) printf("%d ",wi[i]);

maxx=wi[1];

if( n <= m) cout

事實證明,線段樹是這三個**中最快的。

貪心演算法 多機排程問題C

1.問題 要求給出一種作業排程方案,使所給的n個作業在盡可能短的時間內由m臺機器加工處理完成。約定,每個作業均可在任何一台機器上加工處理,但未完工前不允許中斷處理。作業不能拆分成更小的子作業。2.演算法解析 此演算法的貪心策略主要在於sort排序演算法,按照作業時間從大到小進行排序。然後再考慮機器數...

貪心 加工生產排程(雙機排程貪心問題)

時間限制 1 sec 記憶體限制 64 mb 提交 41 解決 21 提交 狀態 討論版 命題人 外部匯入 題目描述 有n個部件需在a b機器上加工,每個工件都必須經過先a後b兩道工序。已知 部件i在a b機器上的加工時間分別為ai,bi。問 如何安排n個工件的加工順序,才能使得總加工時間最短?輸入...

貪心 任務排程問題

問題描述 假設給定n個任務的集合t,每個任務i有啟動時間si和完成時間fi si問題分析 要求 在最少的機器上安排完所有任務。如何選擇貪心策略才能使問題的解為最優解?顯然,開始時間最早的任務需要被先執行,但是最優解要求我們使用的機器最少,因此我們每次選擇時應盡量使用相同的機器。若已使用過的機器上現處...