最近团队训练二分专题,颇有体悟。
二分题解第一篇,主要讲述如何判断是否使用二分以及大部分二分的“模板”,以及一些附带的“私货”。
总的来说,如果一个题的答案以及计算的过程是单调的,就大概率可以用二分优化(个人理解),大体的模板便是一个check()函数加上一个while()循环。
先来看看 洛谷的P1083 [NOIP2012 提高组] 借教室这道题
看到题目时我就有了一个明确的想法,每一个订单出现后,将在这个订单中的出现的日期的限制中的每天的教室数都减去这个订单所要借的数目,当哪一个订单出现后,有某天的教室数小于0时就输出这一订单编号。
这时经过粗略计算,并根据题目所给的数据范围我可以很确定的说如果暴力(几个for循环嵌套)肯定超时,那么这时候发现订单的顺序是递增的,租借的数目是递减的,就可以用二分去缩减订单的范围,直到最终剩下的唯一解输出。
二分循环如下:
while(l<y){//二分,用来判断l到第y天的天数中是否有负数,最终缩减范围,输出答案
int mid=l+(y-l)/2;
if(check(mid)==false){
y=mid;
}else l=mid+1;
}
当然二分模板好写,