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
    你灵魂的欲望,是你命运的先知。

  • 相关阅读:
    jQuery(四)
    jQuery(三)
    jQuery(二)
    jQuery(一)
    JS(四)
    JS(三)
    JS(二)
    类似openDialog的弹窗
    vue的异步组件按需加载
    vue实现点击、滑动右侧字母对应各个城市
  • 原文地址:https://www.cnblogs.com/RioTian/p/14819681.html
Copyright © 2011-2022 走看看