东华OJ-进阶题-19-排队打水问题(C++)

  • 问题描述
    有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;
}
相关推荐
yaoxin5211233 小时前
434. Java 日期时间 API - Period 基于日期的时间段
java·开发语言·python
凡人叶枫3 小时前
Effective C++ 条款30:透彻了解 inlining 的里里外外
linux·开发语言·c++·嵌入式开发·effective c++
noipp3 小时前
推荐题目:洛谷 P10907 [蓝桥杯 2024 国 B] 蚂蚁开会
c语言·c++·算法·编程·洛谷
学逆向的4 小时前
C++纯虚函数
开发语言·c++·网络安全
程序员二叉4 小时前
【JUC】ThreadLocal底层原理|内存泄漏|弱引用|跨线程传递方案
java·开发语言·面试·职场和发展·juc
程序员二叉4 小时前
【JUC】线程池全套深度详解|参数|流程|拒绝策略|调优|异常处理
java·开发语言·jvm·算法·面试·juc
青山木4 小时前
Hot 100 --- 轮转数组
java·数据结构·算法
徐小夕5 小时前
Loop Engineering 深度解析与实战指南(全网最全)
前端·算法·github
凡人叶枫5 小时前
Effective C++ 条款22:将成员变量声明为 private
linux·开发语言·c++
Qt程序员5 小时前
掌握 Linux 内核调度:从原理到实现(进程篇)
java·开发语言