UVA - 1153 Keep the Customer Satisfied

题目大意:有n个客户,去买一家商场,结算时候排队,每个顾客有一个等待时间,过了等待时间顾客就会不满,然后每个顾客又有一个结算时间,问说最多让几个顾客满意。

解题思路:先按照等待时间从小到大排列,然后遍历一遍,每次加上当前人的时间,如果时间超过了当前的等待时间,则减掉前面满意人当中结算时间最长的那个人的时间。

#include <cstdio>
#include <queue>
#include <algorithm>
using namespace std;

struct Order {
    int q;
    int d;
    bool operator < (const Order& a) const {
        return d < a.d;
    }
} A[800010];

int main() {
    int T;
    scanf("%d", &T);
    while (T--) {
        int n;
        scanf("%d", &n);
        for (int i = 0; i < n; i++)
            scanf("%d%d", &A[i].q, &A[i].d);
        sort(A, A + n);

        int cur = 0;
        priority_queue<int> que;
        for (int i = 0; i < n; i++) {
            cur += A[i].q;
            que.push(A[i].q);
            if (cur > A[i].d) {
                cur -= que.top();
                que.pop();
            }
        }

        printf("%ld\n", que.size());
        if (T) puts("");
    }
    return 0;
}

你可能感兴趣的:(UVA - 1153 Keep the Customer Satisfied)