题目
有n个人排队到r个水龙头去打水,他们装满水桶的时间t1、t2…………tn为整数且各不相等,应如何安排他们的打水顺序才能使他们总共花费的时间最少?
输入
第一行n,r (n< =500,r< =75)
第二行为n个人打水所用的时间Ti (Ti< =100);
数据规模和约定
其中80%的数据保证n< =10
输出
最少的花费时间
样例输入
3 2
1 2 3
样例输出
7
解题思路
本题类似于蓝桥杯题目 1523: 打水问题,本质上都是使用贪心算法,但两者需要输出的值含义不同,题目1523输出的是每一个人等待时间的总和,而本题输出的是打水所消耗的时间与每个人等待的总时间的和(即相较于前者,本题还要加上每个人打水所消耗的时间)。
代码
#include<stdio.h>
#include<stdlib.h>
int cmp(const void *a, const void *b){
return *(int *)a - *(int *)b;//升序
}
int main()
{
int i,j,n,r,temp;//n个人,r个水龙头
scanf("%d %d",&n,&r);
int t[n],wait=0,num;//num记录当前水龙头有几个人来
for (i=0;i<n;i++)
{
scanf("%d",&t[i]);
wait+=t[i];//打水时间
}
qsort(t,n,sizeof(int),cmp);
for (i=0;i<r;i++)
{
temp = n-i-(n/r)*r;//如果有多余的,从第一个水龙头开始分
num = n/r+(temp>0);
for (j=i+r;j<n;j+=r)//每一个水龙头的第一个跳过,因为无需等待
{
wait+=t[j-r]*(num-1);
num--;
}
}
printf("%d",wait);
return 0;
}