算法提高 排队打水问题

问题描述
  有n个人排队到r个水龙头去打水,他们装满水桶的时间t1、t2………..tn为整数且各不相等,应如何安排他们的打水顺序才能使他们总共花费的时间最少?
输入格式
  第一行n,r (n<=500,r<=75)
  第二行为n个人打水所用的时间Ti (Ti<=100);
输出格式
  最少的花费时间
样例输入
3 2
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;
}

猜你喜欢

转载自blog.csdn.net/qq_36424540/article/details/80289231
今日推荐