问题描述:
问题描述
有n个人排队到r个水龙头去打水,他们装满水桶的时间t1、t2………..tn为整数且各不相等,应如何安排他们的打水顺序才能使他们总共花费的时间最少?
输入格式
第一行n,r (n<=500,r<=75)
第二行为n个人打水所用的时间Ti (Ti<=100);
输出格式
最少的花费时间
样例输入
3 2
1 2 3
样例输出
7
数据规模和约定
其中80%的数据保证n<=10
问题分析:
针对此问题,根据题目所给出的条件是得出一共打水所花费最少的时间,可以得出:
如果每个人打水等待的时间最少,那么总共花费的时间也一定是最少的,所以此问题可以变成在有限的水龙头下,怎么安排打水的顺序使得每个人等待的时间最少
关键点:
只有第一个打水的人不用等待,其余所有的人都需要等待。所以在计算等待时间是一个累加的过程:第三个人的等待时间=的二个人等待时间+第二个人打水时间,第二个人等待时间=第一个人打水时间。所以根据水龙头个数分成三组,分别统计等待时间。
安排打水顺序:由于是等待的时间最少,所以前面打水时间用的少的人让后面等待的时间较少,所以应该让打水时间少的人先打水,才能实现每个人花费时间总和最少。
以:
3 2
1 2 3
举个例子:
① 1 3 时间:1+(1+3)=5
② 2 时间:2
总时间:5+2=7
代码实现:
package getWater;
import java.util.Arrays;
import java.util.Scanner;
public class Main {
public static void main(String args[]) {
@SuppressWarnings("resource")
Scanner input = new Scanner(System.in);
// 输入打水的人数
int people = input.nextInt();
// 输入水龙头的个数
int hydrovalve = input.nextInt();
int use_time[] = new int[people];
// 将打水的人按照水龙头个数分成相应的组数
int wait_time[] = new int[hydrovalve];
// 输入每个人的打水时间
for(int i = 0;i<people;i++) {
use_time[i] = input.nextInt();
}
// 测试输入数据
// for(int i = 0;i<people;i++) {
// System.out.println(use_time[i]);
// }
Arrays.sort(use_time);
int sum = 0;
for(int i = 0;i<people;)
for(int j = 0;j<hydrovalve && i<people;i++,j++) {
// 统计每组打水的等待时间
wait_time[j] += use_time[i];
// 统计总共打水时间
sum += wait_time[j];
}
System.out.println(sum);
}
}