问题描述:
有N个人排队到R个水龙头去打水,他们装满水桶的时间为T1,T2,…,Tn为整数且各不相等,应如何安排他们的打水顺序才能使他们花费的时间最少?
【样例输入】
4 2 //4人打水,2个水龙头
2 6 4 5 //每个打水时间
先放代码:
#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
int a[3000001],s[30000001];
int main()
{
int n,r,minx=0,j=0;
memset(s,0,sizeof(s));
scanf("%d%d",&n,&r);
for(int i=1;i<=n;++i) scanf("%d",&a[i]);
sort(a+1,a+n+1);
for(int i=1;i<=n;++i)
{
j++;
if(j==r+1) j=1;
s[j]+=a[i];
minx+=s[j];
}
printf("%d",minx);
}
记一点小笔记:
注意看这两行代码:
s[j]+=a[i];
minx+=s[j];
刚开始很是奇怪,不知为什么这么写,甚至觉得是错的,现在细细分析,写法很巧妙。
首先,我们定义每个水龙头的总时间为s(为数组),则第i个水龙头为s[i],在定义n个人在此打水,每人所花费总时间为t,已知s[i]=t[1]+t[2]+t[3]+.....+t[n]。又因为t[i]=t[i-1]+第i个人自己打水时间,所以可得此处的s[j]+=a[i] 就在求t的各项值,而minx是把它们加起来。