1172 排隊接水
阿新 • • 發佈:2019-01-23
描述
現在有n個人想要接水,以及k個水龍頭,現在已知每個人接水的時間,顯然不同的接水順序,大家要花的等待時間就不一樣。求一個排隊序列使得所有人等待時間(自己在接水的時候肯定也是要站在旁邊等的,所以這個時間也要算進等待時間裡面去)的總和最小。
- 輸入
-
輸入包含多組資料。
第一行為資料的組數x(0<x<=10)。
對於每組資料,第一行為整數n(1<=n<=10000)和k(1<=k<=100)分別為人數和水龍頭的個數,第二行為n個整數,分別表示n個人的接水時間(接水時間<=10000)。
- 輸出
-
每組資料輸出一行,這一行應該有一個數,為所有人等待時間總和的最小值。
樣例輸入
2
5 1
1 2 3 4 5
5 2
1 2 3 4 5
樣例輸出
35
22
提示
第一組資料,最小的總等待時間的最小值為1+(1+2)+(1+2+3)+(1+2+3+4)+(1+2+...+5)=35。 第二組資料,最小的總等待時間的最小值為1+(1+2)+(1+2+4)+3+(3+5)=22。
此題使用排序即可,讓最小的在前
#include <iostream> #include <algorithm> using namespace std; int a[10002]; long long int b[10002]; int main() { int t; cin >> t; int i, j; int n, k; while(t --) { cin >> n >> k; for(i = 1; i <= n ; i ++) { cin >> a[i]; } sort(a + 1, a + n + 1); for(i = 0; i < k; i ++) { b[i] = 0; } unsigned long long int max = 0; for(i = 1; i <= n; i ++) { int temp = (i-1) % k; b[temp] += a[i]; max += b[temp]; } cout << max << '\n'; } return 0; }