78 lines
2.6 KiB
C++
78 lines
2.6 KiB
C++
#include <bits/stdc++.h>
|
||
|
||
using namespace std;
|
||
|
||
//n个人,r个水龙头
|
||
int n, r;
|
||
//打水时间
|
||
int t[101] = {0};
|
||
//第一维表示是几个水龙头,第二维表示现在这个水龙头排队的情况
|
||
int v1[101][101] = {0};
|
||
|
||
//https://blog.csdn.net/yutian74/article/details/89677889?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-1.control&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-1.control
|
||
//找到哪一个队列是最先结束的队列,也就是当前来说最时间总和最短的
|
||
void getWhiceR(int &rInx, int &value, int &inx) { //三个返回值 rInx:第几个水龙头,value:现在总的时间有多长,inx:现在有几个人在排队
|
||
value = INT32_MAX; //默认给了一个极大值,这样方便获取最小值
|
||
//找到最少时间排队的队列
|
||
for (int i = 1; i <= r; ++i) {
|
||
int t = 0;
|
||
int j;
|
||
//当前水龙头的排队总时间
|
||
for (j = 1; j <= 101; ++j) {
|
||
if (v1[i][j] == 0) break;
|
||
t += v1[i][j];
|
||
}
|
||
if (t < value) {
|
||
value = t;
|
||
rInx = i; //记录是哪个水龙头
|
||
inx = j - 1; //记录是第几个位置
|
||
}
|
||
}
|
||
}
|
||
|
||
int main() {
|
||
//输入+输出重定向
|
||
freopen("../1270.txt", "r", stdin);
|
||
//录入打水时间
|
||
cin >> n >> r;
|
||
for (int i = 1; i <= n; i++) {
|
||
cin >> t[i];
|
||
}
|
||
//排序
|
||
sort(t + 1, t + n + 1);//注意从数组索引1开始,则为t+1--->t+n+1
|
||
|
||
//将每一个人员都模拟入入水龙头前
|
||
for (int i = 1; i <= n; ++i) {
|
||
//找出这r个队列中最先结束的那一个,放进去
|
||
int rInx, value, inx;
|
||
getWhiceR(rInx, value, inx);
|
||
v1[rInx][inx + 1] = t[i];//将此人员放到探测出最适合放的水龙头队列中去排队
|
||
}
|
||
|
||
//输出结果,计算打水时间+等待时间
|
||
int timeAll = 0;
|
||
for (int i = 1; i <= r; ++i) {
|
||
int j;
|
||
for (j = 1; j <= 101; ++j) {
|
||
if (v1[i][j] > 0) {
|
||
cout << v1[i][j] << " ";
|
||
} else {
|
||
break;
|
||
}
|
||
}
|
||
|
||
//回退一个
|
||
j--;
|
||
//计算等待时间+打水时间,j-1是停止的位置
|
||
for (int k = 1; k <= j; k++) {
|
||
timeAll += v1[i][k] * (j - k + 1); //前面的人员打水时间,都会累积成后面人员的等待时间,所以就是乘以 (length+1-k)*t的关系。
|
||
}
|
||
cout << endl;
|
||
}
|
||
|
||
cout << timeAll << endl;
|
||
//关闭文件
|
||
fclose(stdin);
|
||
return 0;
|
||
}
|