/*
【杂题】:排队打水问题(normal)
http://mail.bashu.cn:8080/JudgeOnline/showproblem?problem_id=1002
Time Limit:1000MS Memory Limit:65536K
Total Submit:495 Accepted:170
Description
有n个人排队到r个水龙头去打水,他们装满水桶的时间t1、t2………..tn为整数且各不相等,应如何安排他们的打水顺序才能使他们总共花费的时间最少?
Input
第一行n,r (n<=500,r<=75)
第二行为n个人打水所用的时间Ti (Ti<=100);
Output
最少的花费时间
Sample Input
3 2
1 2 3
Sample Output
7
Source
xinyue
*/
#include <stdio.h>
#define MAXN 1001
#define MAXR 101
int main(void)
{
int n,r,time=0,max;
int mt[MAXN]={0},mr[MAXR]={0};
int i,j,k,temp;
scanf("%d %d",&n,&r) ;
for(i=1 ; i<= n ; i++)
scanf("%d",&mt[i]) ;
if ( n <= r) /*特殊情况处理*/
{
for(i=1 ; i<= n ; i++)
time += mt[i] ;
printf("%d ",time);
return 0 ;
}
for(i=1 ; i< n ; i++) /*排序*/
for(j=i+1 ; j<= n ; j++)
if (mt[j] < mt[i])
{
temp = mt[j] ;
mt[j] = mt[i];
mt[i] = temp ;
}
max = (n/r)*r ;
for(i=1 ; i<= max; i += r) /*分组处理,贪心分组,因为具有这种性质*/
{
for(j=1,k=i ; j<=r ; j++,k++)
{
mr[j] += mt[k] ;
time += mr[j] ;
}
}
for(j=1,k=max+1; k <= n ; j++,k++)
{
mr[j]+= mt[k] ;
time += mr[j] ;
}
printf("%d ",time);
return 0 ;
}