蓝桥 排队打水问题 (贪心)

题目描述
有n个人排队到r个水龙头去打水,他们装满水桶的时间t1、t2…………tn为整数且各不相等,应如何安排他们的打水顺序才能使他们总共花费的时间最少?

数据规模和约定
其中80%的数据保证n< =10

输入
第一行n,r (n< =500,r< =75)
第二行为n个人打水所用的时间Ti (Ti< =100);
输出
最少的花费时间
样例输入
3 2
1 2 3
样例输出
7

每个人用的时间=等待时间+打水时间, 打水时间固定,所以要让所用花费时间最小,就应该让所有人的等待时间最小。所以需要从小到大排序,把时间小的放在前面。
有r个水龙头就要模拟这r个水龙头,先从小到大取出r个人放进去,然后取出打水时间最小的拿出来,再放入等待队列中打水时间最小的,每次都要对r个水龙头重新排序
因为已经排好序的数组在进行sort快排会容易退化到n^2 的复杂度,所以这里使用优先队列来做。

#include 
#include 
#include 
#include  
#include 
using namespace std;priority_queue<int, vector<int>, greater<int> > q;
int a[505];
int n, r, ans=0;int main(){scanf("%d%d", &n, &r);for (int i=1; i<=n; i++){scanf("%d", &a[i]);ans += a[i];}sort(a+1, a+n+1);for (int i=1; i<=r; i++){q.push(a[i]);}for (int i=r+1; i<=n; i++){int t=q.top();q.pop();ans += t;t = t+a[i];q.push(t);}cout<<ans;return 0;
}


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部