题意:有n个任务,每个任务有三个参数ri,di和wi,表示必须在时刻[ri,di]之内执行,工作量为wi。处理器执行速度可以变化,当执行速度为s时,工作量为wi。处理器的速度可以变化,当执行速度为s时,一个工作量为wi的任务需要执行wi/s个单位时间。任务不一定连续执行,可以分成若干块。求出处理器执行过程中最大速度的最小值。
其实刚看到这道题的时候,看到最大值的最小值,首先想到要用二分枚举答案,而且这个想法也十分正确。
但是问题的难点在于如何判断在某个速度下能否完成所有任务,所以必然要有个优先级,什么样的任务应该先做。可以发现如果现在可以选择执行的任务有多个,那么必然要选择结束时间早的任务先执行,这样才能获得最优解。
所以总体的思路就是,将所有任务按照开始时间排序,二分枚举处理器的速度,然后对每个速度进行判断。按照任务开始时间依次加入优先队列,队列优先级是结束时间早的优先。最后就能判断该速度是否能够执行完所有任务。
#include <algorithm>
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <cstdlib>
#include <queue>
#define INF 0x7fffffff
using namespace std;
struct node
{
int l,r,v;
} p[2000005],u;
bool operator < (node a,node b)
{
return a.r>b.r;
}
int cmp(node a ,node b)
{
ret