问题描述
有n个人排队到r个水龙头去打水,他们装满水桶的时间t1、t2………..tn为整数且各不相等,应如何安排他们的打水顺序才能使他们总共花费的时间最少?
输入格式
第一行n,r (n<=500,r<=75)
第二行为n个人打水所用的时间Ti (Ti<=100);
第二行为n个人打水所用的时间Ti (Ti<=100);
输出格式
最少的花费时间
样例输入
3 2
1 2 3
1 2 3
样例输出
7
数据规模和约定
其中80%的数据保证n<=10
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
#define bug(x) printf("%d***\n",x)
using namespace std;
typedef long long ll;
const int maxn=510;
const int INF=0x3f3f3f3f;
int val[maxn];
int n,r;
/*
理解错了提议,他说总用时间最少,是说
所有人的时间加起来,所以就变成了
所有人的等待时间最少,自然是小的在前面,等待时间最少
*/
int solve(){
int ans=0;
priority_queue<int,vector<int>,greater<int> > q;
for(int i=1;i<=r;i++){
ans+=val[i];
q.push(val[i]);
}
for(int i=r+1;i<=n;i++){
int now=q.top();
q.pop();
now+=val[i];
ans+=now;
q.push(now);
}
return ans;
}
int main(){
while(~scanf("%d %d",&n,&r)){
for(int i=1;i<=n;i++){
scanf("%d",&val[i]);
}
sort(val+1,val+n+1);
printf("%d\n",solve());
}
return 0;
}