{"title":"C++:题目描述","description":"学校里有一个水房,水房里一共装有m个龙头可供同学们打开水,每个龙头每秒钟的供水量相等,均为1。\n\n现在有n名同学准备接水,他们的初始接水顺序已经确定。将这些同学按接水顺序从1到n编号,i号同学的接水量为wi​。接水开始时,1到m号同学各占一个水龙头,并同时打开水龙头接水。当其中某名同学j完成其接水量要求wj后,下一名排队等候接水的同学k马上接替j同学的位置开始接水。这个换人的过程是瞬间完成的,且没有任何水的浪费。即j同学第x秒结束时完成接水,则k同学第x+1秒立刻开始接水。若当前接水人数n'不足m,则只有n'个龙头供水,其它m-n'个龙头关闭。\n\n现在给出n名同学的接水量,按照上述接水规则,问所有同学都接完水至少需要多少秒。","keywords":"C++算法, 水房接水, 队列, 算法题, 代码实现, 优化","content":"#include <iostream>\n#include <vector>\n#include <queue>\nusing namespace std;\n\nint main() {\n int n, m;\n cin >> n >> m;\n \n vector<int> w(n);\n for(int i = 0; i < n; i++) {\n cin >> w[i];\n }\n \n queue<int> q;\n for(int i = 0; i < min(n, m); i++) {\n q.push(w[i]);\n }\n \n int time = 0;\n while(!q.empty()) {\n int cur = q.front();\n q.pop();\n \n time++;\n cur--;\n \n if(cur > 0) {\n q.push(cur);\n }\n \n if(n < m && q.size() == n) {\n break;\n }\n \n if(n >= m && q.size() == m) {\n continue;\n }\n \n if(n - q.size() > 0) {\n int num = min(n - q.size(), m);\n for(int i = 0; i < num; i++) {\n q.push(w[m + i]);\n }\n }\n }\n \n cout << time << endl;\n \n return 0;\n}"}

C++ 算法题:水房接水问题

原文地址: http://www.cveoy.top/t/topic/pYkb 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录