codevs 3377 Mz 接水問題2

2022-05-15 17:45:44 字數 1559 閱讀 9007

學校裡有乙個水房,水房裡一共裝有m個龍頭可供同學們開啟水,每個龍頭每秒鐘的供水量相等,均為1。

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

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

特別地,同學們在打水前排好了隊,接水所用時間更長的先接。

(ps:出題人本來想設計乙個貪心的題目,然後發現用貪心做有反例,只能強改題目,在此宣告道歉。不要在意樣例解釋。)

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

第 2 行 n 個整數 w1、w2、„„、wn,每兩個整數之間用乙個空格隔開,wi表示 i 號同學的接水量。 

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

5 34 4 1 2 1

【輸入輸出解釋】

第 1 秒,3 人接水。第 1秒結束時,1、2、3 號同學每人的已接水量為 1,3 號同學接完水,4 號同學接替 3 號同學開始接水。  

第 2 秒,3 人接水。第 2 秒結束時,1、2 號同學每人的已接水量為 2,4 號同學的已接水量為 1。  

第 3 秒,3 人接水。第 3 秒結束時,1、2 號同學每人的已接水量為 3,4 號同學的已接水量為 2。4號同學接完水,5 號同學接替 4 號同學開始接水。  

第 4 秒,3 人接水。第 4 秒結束時,1、2 號同學每人的已接水量為 4,5 號同學的已接水量為 1。1、2、5 號同學接完水,即所有人完成接水。 

【資料範圍】

對於 30%的資料,n≤10,000,m≤1,000;

對於全部的資料,1≤m≤n≤1,000,000,1≤m≤100,000。

先從小到大排序,然後先將前m個數放入小根堆;

然後取出堆頂元素,加a[i]後在放入堆中;

輸出堆中最大元素。

#include#include

#include

using

namespace

std;

priority_queue

,greater >a;

int n,m,b[1000001

],maxn;

bool cmp(int x,int

y)int

main()

if(n<=m)

sort(b+1,b+n+1

,cmp);

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

a.push(b[i]);

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

while(a.size()>1

) a.pop();

printf("%d

",a.top());

return0;

}

codevs 3377 Mz 接水問題2

3377 mz 接水問題2 時間限制 1 s 空間限制 64000 kb 題目等級 鑽石 diamond 題解 檢視執行結果 題目描述 description 學校裡有乙個水房,水房裡一共裝有m個龍頭可供同學們開啟水,每個龍頭每秒鐘的供水量相等,均為1。現在有n名同學準備接水,他們的初始接水順序已經...

codevs 3377 Mz 接水問題2

學校裡有乙個水房,水房裡一共裝有m個龍頭可供同學們開啟水,每個龍頭每秒鐘的供水量相等,均為1。現在有n名同學準備接水,他們的初始接水順序已經確定。將這些同學按接水順序從 1到n編號,i號同學的接水量為wi。接水開始時,1到m號同學各佔乙個水龍頭,並同時開啟水龍頭接水。當其中某名同學j完成其接水量要求...

P3377 左偏樹,模板)

題意 如題,一開始有n個小根堆,每個堆包含且僅包含乙個數。接下來需要支援兩種操作 操作1 1 x y 將第x個數和第y個數所在的小根堆合併 若第x或第y個數已經被刪除或第x和第y個數在用乙個堆內,則無視此操作 操作2 2 x 輸出第x個數所在的堆最小數,並將其刪除 若第x個數已經被刪除,則輸出 1並...