蓝桥杯-算法提高(贪心算法):排队打水

问题描述:

问题描述

  有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);
	}
}

 


 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章