# 二分查找
手写二分
1 | //找到该数的左边界 |
利用 STl
1 | int main() |
浮点数二分
1 | double l = -1e4, r = 1e4, mid; |
# 应用
# 最佳牛围栏
- 如果用前缀和 + 暴力的话肯定会超时,那这题用什么算法呢?
- 这题的题意可以简化为:选择不少于 f 个数,让他们的平均值最大。是否可以使用二分,判断是否存在一个平均值大于 mid 的选择方式,如果存在那么可以在大于 mid 的范围内继续寻找,如果不存在就在小于 mid 的范围内寻找,直到找到最后的 mid。因为数据范围是 所以使用二分 不会超时
至少 f 个数这个条件要如何在二分中体现呢?要平均值最大,就需要 尽可能大, 尽可能小,题目要求的是至少 f 个,所以可以在 范围内寻找最小值
min_val
,使用s[i]-min_val
即可要判断 mid 是否可行,由 3 可知我们并未记录这段区间有多少数,所以要怎么判断呢?我们可以让每个 都减去 mid 这个待判断的平均值,那么最后只需判断那个区间和 0 的大小即可
1 |
|