1. 程式人生 > >華為2018秋招程式設計題3:接啤酒

華為2018秋招程式設計題3:接啤酒

題目描述

酒館裡有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; }