能不能二分:一个是有界,一个是单调。
核心问题
- 答案有界:最少耗时的范围 [ k , max{t1,t2,…,tn} ]
- 单调:最少耗时下降得越大,花费的资源(sum)越多。
总结:目标值就是找到在这个范围内 [ k , max{t1,t2,…,tn} ],满足sum<=m里面的最小值,如下图所示。
代码实现有核心点:
-
对答案范围进行二分
-
对每个“中点”mid进行判断
1、计算所有大于mid的ti下降mid的所需要的总资源数:sum=(ti-mid)*ci
2、如果sum<=mid,则将r的值向左移动去看看r能不能更小
3、反之,则将l的值向右移,寻找花费更小的
代码如下
#include<iostream>
using namespace std;
#define x first
#define y second
typedef pair&l