/*
【杂题】:排队打水问题(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 ;
}