1. 程式人生 > >1172 排隊接水

1172 排隊接水

描述          

    現在有n個人想要接水,以及k個水龍頭,現在已知每個人接水的時間,顯然不同的接水順序,大家要花的等待時間就不一樣。求一個排隊序列使得所有人等待時間(自己在接水的時候肯定也是要站在旁邊等的,所以這個時間也要算進等待時間裡面去)的總和最小。

輸入

輸入包含多組資料。

第一行為資料的組數x0<x<=10)。

對於每組資料,第一行為整數n1<=n<=10000)和k1<=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;
}