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

题目描述
有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 <iostream>
#include <cstdio>
#include <cstring>
#include <queue> 
#include <algorithm>
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;
}

猜你喜欢

转载自blog.csdn.net/weixin_42172261/article/details/104984938