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


 


 

你可能感兴趣的:(1172 排队接水)