问题:1228. 排队打水问题
类型:贪心
题目描述:
有 n 个人排队到r 个水龙头去打水,他们装满水桶的时间 t1,t2,…,tn 为整数且各不相等,应如何安排他们的打水顺序才能使他们花费的总时间最少?
每个人打水的时间 = 排队的时间 + 实际打水的时间,本题假设一个人打好水,排在他后面的人接着打水的这个切换过程不消耗时间。
比如,有 2 个人 A 和 B ,他们打水的时间分别是 3 和 2 ,只有 1 个水龙头,这时,如果 A 先打水,B 后打水,那么 A 和 B 打水的时间分别为 3 、3+2( B 排队 3 分钟)。
因此,所有人打水的总时间就是每个人的打水时间及每个人的排队时间的总和。
输入:
第 1 行,两个整数n (1≤n≤500) 和 r (1≤r≤100)。
第 2 行,n 个正整数 t1,t2,…,tn ,(1≤ti≤1000)表示每个人装满水桶的时间。
输出:
1 行,一个正整数,表示他们花费的最少总时间。
样例:
输入:
4 2
2 6 4 5
输出:
23
完整代码如下:
#include<bits/stdc++.h>
using namespace std;
int main(){
//一、分析问题
//已知: n个人,r个水龙头,每个人装满水桶的时间;
//未知:花费的最少总时间;
//关系:贪心。
//二、数据定义
int n,r,t[110],s_time=0,x;
//三、数据输入
cin>>n>>r;
for(int i=0;i<n;i++){
cin>>t[i];
}
//四、数据计算
sort(t,t+n);
for(int i=0;i<n;i++){
if (i<r){
s_time+=t[i];
}else{
x=i;
while(x>=0){
s_time+=t[x];
x-=r;
}
}
}
//五、输出结果
cout<<s_time;
return 0;
}