華為2018秋招程式設計題3:接啤酒
阿新 • • 發佈:2019-02-05
題目描述
酒館裡有m個龍頭可供顧客們接啤酒,每個龍頭每秒的出酒量相等,都是1。現有n名顧客準備接酒,他們初始的接酒順序已經確定。將這些顧客按接酒順序從1到n編號,i號顧客的接酒量為w_i。接酒開始時,1到m號顧客各佔一個龍頭,並同時開啟龍頭接酒。當其中某個顧客j完成其接酒量要求wj後,下一名排隊等候接酒的顧客k馬上接替j顧客的位置開始接酒。這個換人的過程是瞬間完成的,且沒有任何酒的浪費。即j顧客第x秒結束時完成接酒,則k顧客第x+1秒立刻開始接酒。若當前接酒人數n不足m,則只有n個龍頭供酒,其它m-n個龍頭關閉。現在給出n名顧客的接酒量,按照上述規則,問所有顧客都接完酒需要多少秒?
輸入描述
輸入包括兩行,第一行為以空格分割的兩個數n和m, 分別表示接酒的人數和酒龍頭個數,均為正整數。
第二行n個整數w_i,(1 <= w_i <= 100)表示每個顧客接酒量輸出描述
如果輸入合法輸出接酒所需總時間(秒)。
示例1
輸入
5 3
4 4 1 2 1
輸出
4
提示
1 ≤ n ≤ 10000,1 ≤ m ≤ 100 且 m ≤ n;1 ≤ w i ≤ 100。
AC程式碼
題目本身不難,直接模擬即可。
#include<iostream>
using namespace std;
int w[10010]; // 每個顧客的接酒量
int lastw[10010]; // 每個龍頭位置的同學還需要的接酒量
int main() {
int n, m;
int time = 0;
while (~scanf("%d%d",&n,&m)) {
time = 0;
for (int i = 1; i <= n; i++) scanf("%d",&w[i]);
for (int i = 1; i <= m; i++) lastw[i] = w[i]; // 開始時候,前m個顧客接酒
int i = m + 1;
while (i <= n) { // 只要顧客數大於龍頭數,就會出現交替的現象
int time_min = INT_MAX;
for (int j = 1; j <= m; j++) { // 找到前m個顧客,最先接完的那位顧客的接酒量,也就是所花的時間,單位時間為1.
time_min = min(time_min,lastw[j]);
}
time += time_min; // 總時間加上這最先完成的時間。
for (int j = 1; j <= m; j++) {
lastw[j] -= time_min; // 當前m個顧客在最先接完酒的顧客退出後,還需接酒量(時間)
if (lastw[j] == 0) { // 最先接完酒的顧客退出後,下一位顧客立馬開始接酒
lastw[j] = w[i];
i++;
}
}
}
int time_min = 0;
for (int i = 1; i <= m; i++) { // 當顧客數小於龍頭數,時間取決於最後完成接酒的那位顧客
time_min = max(time_min, lastw[i]);
}
time += time_min;
printf("%d\n",time);
}
return 0;
}