zoukankan      html  css  js  c++  java
  • 【每日一题】37. [JSOI2007]建筑抢修 (优先队列 + 贪心)

    补题链接:Here

    算法涉及:优先队列 + 贪心

    因为每一个都有截止时间,按照截止时间排序下来,
    如果修复这个工程的时间+修复这个之前的总时间<=截止时间。那么就是可以在规定的时间内完成。
    保证在规定的时间内完成的数量最多。

    如果修复这个工程的时间+修复这个之前的总时间>截止时间。就是时间超限这个工程不能完成:
    在这里要细想一下:不能完成的时候,如果修复当前这个工程的时间比修复之前工程的最大时间要短,就是可以总时间上更优,我当然是选择修复这个而不是去修复那个时间比较长的。//这样保证时间最短。
    因为我们是按截止时间排的序,所以上个能完成的这个也就一定能完成。

    我们每次都要找到之前修复工程时间最长的,所以可以直接用一个优先队列来维护修复工程时间最长的。

    #define x first
    #define y second
    const int N = 150000 + 10; // 别开小了
    pair<int, int>a[N];
    void solve() {
        int n; cin >> n;
        for (int i = 1; i <= n; ++i)cin >> a[i].y >> a[i].x;
        sort(a + 1, a + 1 + n);
        int now = 0, cnt = 0;
        priority_queue<int>q;
        for (int i = 1; i <= n; ++i) {
            if (now + a[i].y <= a[i].x) {
                now += a[i].y;
                cnt++;
                q.push(a[i].y);
            } else if (q.top() > a[i].y) {
                now -= q.top(), now += a[i].y;
                q.pop(), q.push(a[i].y);
            }
        }
        cout << cnt << "
    ";
    }
    

    The desire of his soul is the prophecy of his fate
    你灵魂的欲望,是你命运的先知。

  • 相关阅读:
    年少时的"胡思乱想"
    daemon框架
    MVC框架,see again
    《Redis设计与实现》读书笔记
    小胖妞洗发水广告
    项目视图 Project Browser
    Unity 基础
    Unity手册-Unity概述
    rabbitmq 命令&& rabbitmq教程(一)
    C#动态方法调用 提高程序的扩展性
  • 原文地址:https://www.cnblogs.com/RioTian/p/14819681.html
Copyright © 2011-2022 走看看