问题描述
有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; }