接水問題 題解

2021-09-29 02:08:29 字數 3412 閱讀 2706

學校裡有乙個水房,水房裡一共裝有 m

mm 個龍頭可供同學們開啟水,每個龍頭每秒鐘的供水量相等,均為 111。

現在有 n

nn 名同學準備接水,他們的初始接水順序已經確定。將這些同學按接水順序從 1

11 到 n

nn 編號,i

ii 號同學的接水量為 w

iw_i

wi​ 。接水開始時, 1

11 到 m

mm 號同學各佔乙個水龍頭,並同時開啟水龍頭接水。當其中某名同學 j

jj 完成其接水量要求 w

jw_j

wj​ 後,下一名排隊等候接水的同學 k

kk 馬上接替 j

jj 同學的位置開始接水。這個換人的過程是瞬間完成的,且沒有任何水的浪費。即 j

jj 同學第 x

xx 秒結束時完成接水,則 k

kk 同學第 x+1

x+1x+

1 秒立刻開始接水。若當前接水人數 n』n』

n』不足 m

mm,則只有 n』n』

n』個龍頭供水,其它 m−n

』m−n』

m−n』

個龍頭關閉。

現在給出 n

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

第 1

11 行 2

22 個整數 n

nn 和 m

mm,用乙個空格隔開,分別表示接水人數和龍頭個數。

第 2

22 行 n

nn 個整數 w1,

w2,…

,wnw_1, w_2, …, w_n

w1​,w2

​,…,

wn​ ,每兩個整數之間用乙個空格隔開,w

iw_i

wi​ 表示 i

ii 號同學的接水量。

1

11 個整數,表示接水所需的總時間。

534

4121

4
8423

7187

3270

9380

76

163
1≤m

≤102

1 \le m \le 10^2

1≤m≤1021≤

n≤10

41 \le n \le 10^4

1≤n≤1041≤

wi≤100

1 \le w_i \le 100

1≤wi​≤

100m≤n

m \le n

m≤n用迴圈+陣列模擬接水, 1

11 次迴圈算 1

11 秒。

陣列下標就是每個水龍頭的標號 (1

11~m

mm)。

那麼陣列的值就是對應的學生對應的接水量。

剛開始時 1

11~m

mm 個水龍頭預設的對應 1

11~m

mm 編號學生的接水量。

一旦有乙個學生接完了 那麼就讓下乙個等待接水的學生來這個水龍頭接水。

也就是讓下個學生對應的接水值賦值這個這個水龍頭對應的陣列

c ++

c++c+

+ **如下

//這裡t是下個等待接水的學生的編號

//s陣列是接水值

//m如題意

//ans為答案

for(

int i =

1; i <= m; i++

)ans++

;

以上是核心**。

接下來處理億一下細節

c ++

c++c+

+整體**如下。

#include

//萬能頭

using

namespace std;

int s[

11000

], t, ans;

int m, n;

intmain

(int argc,

char

**ar**)

ans++;}

cout << ans;

return0;

}

最後。。。

不說了,放!

我放棄了

繼續縮時間!

我們看到題目裡說的 1≤m

≤102

;1≤n

≤104

;m≤n

1 \le m \le 10^2;1 \le n \le 10^4;m \le n

1≤m≤10

2;1≤

n≤10

4;m≤

n,發現資料範圍有點大。

先用scanf()和printf()試試。

#include

//萬能頭

using

namespace std;

int s[

11000

], t, ans;

int m, n;

intmain

(int argc,

char

**ar**)

ans++;}

printf

("%d"

, ans)

;return0;

}

然後發現並沒有什麼用,還是tle

分析**,發現第7行的for (int i = 1; i <= m; i++)這裡的m

應該是n

!改億一改試試。

#include

//萬能頭

using

namespace std;

int s[

11000

], ans, n, m, t;

intmain

(int argc,

char

**ar**)

} ans++;}

cout << ans;

return0;

}

然後就,就,就,ac了!

2023年 noi

pnoip

noip

普及組第 2

22 題 ↩︎

接水果 題解

雖然是noi noi ctsc,但感覺還沒有平時考試難,可能是這種題太套路了.給了你一棵樹,給了你一些路徑,每次詢問,u,v兩點間的第k小的子路徑 必須是給出的那些路徑中的 怎麼判某條路徑是某條路徑的子路徑?乙個套路就是用dfs序的區間包含關係.這個套路大概自己推理一下就出來了.然後發現限制條件是乙...

排隊接水 題解

題目描述 有 n個人在乙個水龍頭前排隊接水,假如每個人接水的時間為 ti,請程式設計找出這 n個人排隊的一種順序,使得 n 個人的平均等待時間最小。輸入格式 第一行為乙個整數 n。第二行 n個整數,第 i 個整數 ti,表示第 i 個人的等待時間 ti。輸出格式 輸出檔案有兩行,第一行為一種平均時間...

接水問題 二

n個人一起排隊接水,第i個人的重要性是a i 需要b i 的時間來接水。1 n 100000 0 b i 1000 0 a i 1000 同時只能有乙個人接水,正在接水的人和沒有接水的人都需要等待。完成接水的人會立刻消失,不會繼續等待。你可以決定所有人接水的順序,並希望最小化所有人等待時間乘以自己的...