题目大意:有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;
}