东华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;
}
相关推荐
疯狂打码的少年10 小时前
【操作系统】页面置换算法(OPT/FIFO/LRU)
算法
小O的算法实验室10 小时前
2026年CIE,优化客货协同运输:综合地铁系统的列车容量动态分配
算法
Coder_Shenshen11 小时前
西门子S7CommPlus协议鉴权算法原理与流程详解
网络·后端·算法
大圣编程12 小时前
Python中continue语句的用法是什么?
开发语言·前端·python
硕风和炜12 小时前
【LeetCode: 2492. 两个城市间路径的最小分数 + DFS】
java·算法·leetcode·深度优先·dfs·bfs·并查集
upgrador12 小时前
基础知识:C++ STL构造函数的左闭右开惯例及其实现原理
开发语言·c++
我是一颗柠檬13 小时前
【Java项目技术亮点】加权轮询负载均衡算法
java·算法·负载均衡
灯厂码农13 小时前
C语言动态内存分配完全指南(malloc、calloc、realloc、free)
java·c语言·算法
yoothey13 小时前
报废审批流规则引擎设计——责任链模式完整实现
linux·开发语言·bash
geovindu13 小时前
python: Functional Options Pattern
开发语言·后端·python·设计模式·惯用法模式·函数式选项模式