![](https://i-blog.csdnimg.cn/blog_migrate/3db5889c7de59ada571fb1e1010f62bf.png)
![](https://i-blog.csdnimg.cn/blog_migrate/aa2814c29608be5cd97442353f5208b8.png)
#include <iostream>
#include<iomanip>
#include<math.h>
using namespace std;
struct peo {
int time_wait;
int finish;
int water;
};
struct tapp {
int id;
int run;
};
int judgContinueWater(peo a[], int n) { //判断当前是否有人在排队
int a_have = 0;
for (int j = 0; j < n; j++) {
if (a[j].water > 0) {
a_have = 1;
}
}
return a_have;
}
int findmin(peo a[], int n) { //找到所需时间最短的人
int min = 10000000;
int min_i = 1010000;
for (int i = 0; i < n; i++) {
if (min > a[i].water && a[i].water > 0) {
min_i = i;
min = a[min_i].water;
}
}
if (min_i == 1010000) return -1;
else return min_i;
}
int findmin_tap(tapp a[], int r) { //找到当前最快接完的水龙头位置
int min = 10000000;
int min_i = 1010000;
for (int i = 0; i < r; i++) {
if (min > a[i].run && a[i].run > 0) {
min_i = i;
min = a[min_i].run;
}
}
if (min_i == 1010000) return -1;
else return min_i;
}
int main() {
int n, r;
while (cin >> n >> r) {
peo* a = new peo[n];
tapp* tap = new tapp[r];
for (int i = 0; i < r; i++) {
tap[i].run = 0;
tap[i].id = 0;
}
for (int i = 0; i < n; i++) {
a[i].finish = 0;
a[i].time_wait = 0;
}
for (int i = 0; i < n; i++) {
cin >> a[i].water;
}
//init
if (r <= n) { //水龙头数<=人数
for (int i = 0; i < r; i++) {
int min = findmin(a, n);
//首先把桶都接上
tap[i].run = a[min].water;
tap[i].id = min;
a[min].water = -1;
}
int min_tap = findmin_tap(tap, r); //找到当前最快接完的水龙头位置
int pp = 0;
while (min_tap != -1) { //如果当前都接完了
int sub_ll = tap[min_tap].run;
for (int i = 0; i < r; i++) {
if (tap[i].run > 0)tap[i].run -= sub_ll;
}
for (int i = 0; i < n; i++) {
if (a[i].finish == 0)a[i].time_wait += sub_ll;
}
for (int i = 0; i < r; i++) {
if (tap[i].run == 0) {
a[tap[i].id].finish = 1; //如果水龙头的对应桶接完了,将桶的主人.finish置为1
if (judgContinueWater(a, n) == 1) {//如果有还没接水的
int min_continue = findmin(a, n); //立马再给当前所需最短时间的桶接上
tap[i].id = min_continue;
tap[i].run = a[min_continue].water;
a[min_continue].water = -1;
}
}
}
min_tap = findmin_tap(tap, r);
}
int sum = 0;
for (int i = 0; i < n; i++) {
sum += a[i].time_wait;
}
cout << sum << endl;
}
else { //如果水龙头比桶多,直接所有人的时间加起来就行
int sum = 0;
for (int i = 0; i < n; i++) {
sum += a[i].water;
}
cout << sum << endl;
}
}
return 0;
}
![](https://i-blog.csdnimg.cn/blog_migrate/eb4dab36ff8bc89ca53c765f00208bb3.png)
![](https://i-blog.csdnimg.cn/blog_migrate/8014035d2f2f2266261f4321056ab411.png)
我看了一个样例是这样的!!!跟题目的条件不符啊啊啊,调了好多次,实在不知道哪里有问题了,才发现是样例有问题!这也是为啥我上面的函数把min,min_i调成那么大的原因!!!我真的栓q啊
![](https://i-blog.csdnimg.cn/blog_migrate/9849141733591f47245454f0137cc0a3.png)