- 问题描述
有n个人排队到r个水龙头去打水,他们装满水桶的时间t1、t2............tn为整数且各不相等,应如何安排他们的打水顺序才能使他们总共花费的时间最少? - 输入说明
第一行n,r (n<=500,r<=75)
第二行为n个人打水所用的时间Ti (Ti<=100); - 输出说明
最少的花费时间 - 输入范例
cpp
3 2
1 2 3
- 输出范例
cpp
7
感想:用到priority_queue SJF最短作业优先策略就方便很多,pq 堆排序适合贪心。
代码如下:
cpp
#include <bits/stdc++.h>
using namespace std;
int main() {
int n,r;
cin>>n>>r;
vector<int> cost(n);
for(int i = 0; i<n; ++i) {
cin>>cost[i];
}
sort(cost.begin(),cost.end());
// 小顶堆,存储每个水龙头的当前累计时间
priority_queue<int, vector<int>, greater<int>> pq;
for (int i = 0; i < r; ++i) {
pq.push(0); // 初始所有水龙头空闲
}
int total = 0; // 总花费时间
for (int i = 0; i < n; ++i) {
int curr = pq.top();
pq.pop();
total+=curr+cost[i];
pq.push(curr+cost[i]);//更新水龙头目前时间
}
cout << total << endl;
return 0;
}