UVA - 1422 Processor

题目大意:有N个任务,每个任务只能在开始时间到结束时间之内完成有任务量。完成所需时间是w / 处理器速度。输出处理器速度最大值的最小值。

解题思路:一秒一秒来算。建一个优先队列,结束时间越短越优先,因为要最快完成。一秒内能处理的任务量就是处理器的速度mid。出队,如果能处理完就减掉,不能处理完就减一下任务量,因为任务还木有完成,所以还得入队。一直重复,直到全部都出队。

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

int n, vmax;

struct Point {
    int r, d, w;
    bool operator < (const Point & a) const {
        return d > a.d;
    }
} p[10010];

bool cmp (Point a, Point b) {
    return a.r < b.r;
}

bool check(int mid) {
    priority_queue<Point> Q;
    int k = 0;
    for (int i = 1; i <= 20000; i++) {
        while (p[k].r < i && k != n) Q.push(p[k++]);
        int leve = mid;

        while (!Q.empty() && leve != 0) {
            Point cur = Q.top();
            Q.pop();
            if (cur.d < i) return false;
            if (cur.w > leve) {
                cur.w -= leve;
                leve = 0;
                Q.push(cur);
            } else 
                leve -= cur.w;
        }
    }
    if (Q.empty() && k == n)
        return true;
    return false;
}

int solve() {
    int L = 0, R = vmax;
    while (L < R) {
        int mid = (L + R) / 2;
        if (check(mid))
            R = mid;
        else
            L = mid + 1;
    }
    return R;
}

int main() {
    int T;
    scanf("%d", &T);
    while (T--) {
        scanf("%d", &n);
        for (int i = 0; i < n; i++) {
            scanf("%d%d%d", &p[i].r, &p[i].d, &p[i].w);
            vmax += p[i].w;
        }
        sort(p, p + n, cmp);
        printf("%d\n", solve());
    }
    return 0;
}

你可能感兴趣的:(UVA - 1422 Processor)