二分查找三种模板
前两种输出l或r都可以
右边界合法
int l = 0, r = n - 1;
while (l < r) {int mid = l + r >> 1;if (a[mid] < x) l = mid + 1;else r = mid;
}
左边界合法
int l = 0, r = n - 1;
while (l < r){int mid = l + r + 1 >> 1;//注意加1防止死循环if (a[mid] <= x) l = mid;else r = mid - 1;}
double类型
例题:充电宝
while(r-l>1e-5) {double mid=(l+r)/2;if(check(mid))l=mid;else r=mid;}cout<<r; //结果输出r