【每日一题】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
你灵魂的欲望,是你命运的先知。

原文地址:https://www.cnblogs.com/RioTian/p/14819681.html