【每日一题】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 << "\n";
}
posted @   RioTian  阅读(52)  评论(1编辑  收藏  举报
编辑推荐:
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
阅读排行:
· 分享4款.NET开源、免费、实用的商城系统
· Obsidian + DeepSeek:免费 AI 助力你的知识管理,让你的笔记飞起来!
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 全程不用写代码,我用AI程序员写了一个飞机大战
点击右上角即可分享
微信分享提示