安装服务 LA 4850

题目大意

工程师需要安装n个服务,其中的第i个服务Ji需要Si个单位的时间,截止时间为Di,如果在截止时间之前完成任务不会收到惩罚,如果超时惩罚时间时Ci-di意思就是超时多少惩罚值就越大,从t=0时刻开始,找到两个惩罚值之和最小的任务。

分析

安装服务  LA 4850
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<queue>
using namespace std;
const int maxn = 800000 + 10;
struct order {
    int s, t;
    bool operator < (const order & a) const {
        return s < a.s;
    }
}ord[maxn];
priority_queue<order>q;
bool cmp(const order &a, const order & b) {
    return a.t < b.t || (a.t == b.t && a.s < b.s);
}

int main() {
    int t;
    cin >> t;
    while (t--) {
        int n;
        cin >> n;
        for (int i = 0; i < n; ++i) {
            cin>>ord[i].s>>ord[i].t;
        }
        sort(ord, ord + n, cmp);

        while (!q.empty())q.pop();
        int cur = 0;
        for (int i = 0; i < n; ++i) {
            if (cur + ord[i].s <= ord[i].t) {
                q.push(ord[i]);
                cur += ord[i].s;
            }
            else {
                if (q.empty())continue;
                order u = q.top();
                if (u.s > ord[i].s) {
                    cur = cur - u.s + ord[i].s;
                    q.pop();
                    q.push(ord[i]);
                }
            }

        }
        printf("%d\n",q.size());
        if (t)puts("");
    }
    return 0;
}
View Code

 

上一篇:PYTHON的ASCII码转换


下一篇:字符串、文件操作,英文词率统计预处理