藍橋杯-算法提高(貪心算法):排隊打水

問題描述:

問題描述

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

 


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