問題描述:
問題描述
有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);
}
}