问题描述:
有n个人排队到r个水龙头去打水,他们装满水桶的时间t1、t2………..tn为整数且各不相等,应如何安排他们的打水顺序才能使他们总共花费的时间最少?
输入说明:
第一行n,r (n<=500,r<=75)
第二行为n个人打水所用的时间Ti (Ti<=100);
输出说明:
最少的花费时间
范例演示:
输入:3 2
1 2 3
输出:7
解题思路:
每个水龙头都要排人,而每个水龙头排的第n个人的等待时间就是该水龙头前面n-1个人打水时间总和,而该人打水所用时间就是他的等待时间加上他打水的时间,每个人都是这样,而每个人的用时加起来就是总用时。让总用时最少就要让每个人的时间最少,而每个人打水时间不会变,那么就要让每个人等待时间最少,那就要求排在这个人前面的人的打水时间要比他少。
代码如下:
#include<iostream>
#include<algorithm>
using namespace std;
int main()
{
int n,r,sum=0;
cin>>n>>r;
int time[n],i,cnt=0;
for(i=0; i<n; ++i) cin>>time[i];
sort(time,time+n);
int arr[r]= {0};//arr数组是储存每个水龙头的等待时间的
for(i=0; i<r; ++i)
{
if(cnt==n) break;
sum+=arr[i];//每到一个水龙头sum就加一次等待时间
arr[i]+=time[cnt];//每上去一个人接水每个水龙头的等待时
//间就多上这个人的时间
sum+=time[cnt++];//每排一个人都要加上这个人所需时间
if(i==r-1) i=-1;//放完最后一个水龙头又排第一个
}
cout<<sum;
return 0;
}