问题描述
有n个人排队到r个水龙头去打水,他们装满水桶的时间t1、t2………..tn为整数且各不相等,应如何安排他们的打水顺序才能使他们总共花费的时间最少?
输入格式
第一行n,r (n<=500,r<=75)
第二行为n个人打水所用的时间Ti (Ti<=100);输出格式
最少的花费时间
样例输入
3 2
1 2 3
题意不难理解,关键是如何进行问题的转化;
可以想到,每个人打水用的时间事固定的,所以消耗的总时间最少就要让等待的总时间最少,
等待的时间少其实就是让快的人先打就行了。
只要明白了思路,其它的怎么实现就是自己喜好的事了
#include<iostream>
#include<set>
#include<queue>
#include<iomanip>
#include<cmath>
#include<cstring>
#include<map>
#include<stack>
#include<vector>
#include<algorithm>
#include<cstdio>
#define maxn 1300000
#define inf 0x3f3f3f3f
using namespace std;
int vis[maxn];
int prime[maxn];
int cnt=0;
int main()
{
int a[550],b[100];
int i,n,r;
int ans=0;
priority_queue<int,vector<int>,greater<int> > pq;
memset(a,0,sizeof(a));
cin>>n>>r;
for(i=1;i<=n;i++) cin>>a[i];
sort(a+1,a+n+1);
for(i=1;i<=r;i++)
{
ans+=a[i];
pq.push(a[i]);
}
for(i=r+1;i<=n;i++)
{
ans+=pq.top()+a[i];
//pq.pop();
pq.push(a[i]+pq.top());
pq.pop();
}
cout<<ans;
return 0;
}