题目描述
学校里有一个水房,水房里一共装有m个龙头可供同学们打开水,每个龙头每秒钟的供水量不相等,第i个水龙头每秒钟的供水量记为Si。
现在有n名同学准备接水,他们的初始接水顺序已经确定。将这些同学按接水顺序从1到n编号,i号同学的接水量为wi。接水开始时,1到m号同学各占一个水龙头,并同时打开水龙头接水。当其中某名同学j完成其接水量要求wj后,下一名排队等候接水的同学k马上接替j同学的位置开始接水。这个换人的过程是瞬间完成的,且没有任何水的浪费。即j同学第x秒结束时完成接水,则k同学第x+1 秒立刻开始接水。 若当前接水人数n’不足m,则只有n’个龙头供水,其它m-n’个龙头关闭。
现在给出n名同学的接水量,按照上述接水规则,问所有同学都接完水需要多少秒。(
�
,
�
,
�
�
≤
1
0
6
m,n,Si≤10
6
)
输入
第1行2个整数n和m,用一个空格隔开,分别表示接水人数和龙头个数。
第2 行n个整数 w1、w2、、wn,每两个整数之间用一个空格隔开,wi表示 i 号同学的接水量。
第3行m个整数s1、s2、、 sn, 每两个整数之间用一个空格隔开,si表示i号水龙头每秒钟的供水量。
输出
输出只有一行,1个整数,表示接水所需的总时间。
样例
输入数据 1
5 3
4 4 1 2 1
1 2 3
输出数据 1
3
模拟过不了吗
乱码处理下
测试结果没达到预期
【以下回答由 GPT 生成】
解决方案:
首先,我们可以创建一个优先队列来维护当前正在接水的学生。
struct Student {
int id;
int water;
Student(int _id, int _water) {
id = _id;
water = _water;
}
bool operator<(const Student& other) const {
return water < other.water;
}
};
int n, m;
cin >> n >> m;
vector<int> w(n);
for (int i = 0; i < n; i++) {
cin >> w[i];
}
vector<int> s(m);
for (int i = 0; i < m; i++) {
cin >> s[i];
}
priority_queue<Student> pq;
for (int i = 0; i < m; i++) {
pq.push(Student(i, w[i]));
}
int totalTime = 0;
while (!pq.empty()) {
// 取出当前接水量最少的学生
Student curr = pq.top();
pq.pop();
// 更新接水总时间
totalTime += curr.water;
// 检查是否还有学生需要接水
if (m < n) {
// 取出下一个等待接水的学生
int nextStudent = m;
m++;
// 更新该学生的接水量
w[nextStudent] -= s[curr.id];
// 检查该学生是否还需要接水
if (w[nextStudent] > 0) {
pq.push(Student(nextStudent, w[nextStudent]));
}
}
}
cout << totalTime << endl;
完整代码如下:
#include <iostream>
#include <vector>
#include <queue>
using namespace std;
struct Student {
int id;
int water;
Student(int _id, int _water) {
id = _id;
water = _water;
}
bool operator<(const Student& other) const {
return water < other.water;
}
};
int main() {
int n, m;
cin >> n >> m;
vector<int> w(n);
for (int i = 0; i < n; i++) {
cin >> w[i];
}
vector<int> s(m);
for (int i = 0; i < m; i++) {
cin >> s[i];
}
priority_queue<Student> pq;
for (int i = 0; i < m; i++) {
pq.push(Student(i, w[i]));
}
int totalTime = 0;
while (!pq.empty()) {
Student curr = pq.top();
pq.pop();
totalTime += curr.water;
if (m < n) {
int nextStudent = m;
m++;
w[nextStudent] -= s[curr.id];
if (w[nextStudent] > 0) {
pq.push(Student(nextStudent, w[nextStudent]));
}
}
}
cout << totalTime << endl;
return 0;
}
这样就能求解接水问题的总时间了。
【相关推荐】