当一题求符合要求最小值或最大值,并且答案的范围可以确定时,可以使用二分答案法。
二分答案题的关键在于检验结果是否符合要求.
二分答案有多种写法
写法一 (同NOIP2017初赛试题的写法):
结果是mid.
- 找最大值
l = min_ans, r = max_ans;
while(l < r) {
mid = (l + r + 1) / 2;
if(Check(mid)) l = mid;
else r = mid - 1;
}
- 找最小值
l = min_ans, r = max_ans;
while(l < r) {
mid = (l + r + 1) / 2;
if(Check(mid)) r = mid;
else l = mid + 1;
}
写法二:(不推荐的写法)
- 找最大值
l = min_ans, r = max_ans; //建议不要让l=0.
while(l <= r) {
mid = (l + r) / 2;
if(Check(mid)) l = mid + 1;
else r = mid - 1;
}结果是l-1.- 找最小值
l = min_ans, r = max_ans;
while(l <= r) {
mid = (l + r) / 2;
if(Check(mid)) r = mid + 1;
else l = mid - 1;
}
如果答案求的是浮点型,可以乘上10的次方,变为整数再二分答案,最后输出再除以这个数.
比如答案保留两位小数,就乘上100.
4268

被折叠的 条评论
为什么被折叠?



