问题描述
有n个人排队到r个水龙头去打水,他们装满水桶的时间t1、t2………..tn为整数且各不相等,应如何安排他们的打水顺序才能使他们总共花费的时间最少?
输入格式
第一行n,r (n<=500,r<=75)
第二行为n个人打水所用的时间Ti (Ti<=100);
输出格式
最少的花费时间
样例输入
3 2
1 2 3
样例输出
7
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
int main(){
int n,r;//n:人数,r:水龙头个数
cin>>n>>r;
int a[100];
for(int i=1;i<=n;i++){
cin>>a[i];
}
sort(a+1,a+n+1);//要使每个人平均等待时间最小,接水时间小的排在前面
//水龙头
int tap[100];//记录每个水龙头的时间,下标是不同的水龙头,元素是时间
memset(tap,0,sizeof(tap));
int j=1;
int sum=0;//总时间
for(int i=1;i<=n;i++){
if(j==r+1) j=1;//水龙头的个数少于j,从第一个水龙头开始
tap[j]+=a[i];// 这个人在这个水龙头花去的时间
sum+=tap[j];//总时间(包含了一个人等待另一个人接水的时间 )
//对每个接水时间T进行累加是下一个人的等待时间。对每个等待时间进行累加是总等待时间
j++;
}
cout<<sum<<endl;
return 0;
}