1.整数二分:最重要的是确定边界条件
// 整数二分模板 //二分是一定有解的,题目可能无解 #include <iostream> using namespace std; const int N = 1e5 + 5; int n, m; int q[N]; int main() { cin >> n >> m; for (int i = 0; i < n; i++) { scanf("%d", &q[i]); } while (m--) { int x; cin >> x; int l = 0, r = n - 1; while (l < r) // 尽量往左找 定义满足条件的为>=x的 { int mid = (l + r) / 2; // 最后想要不要+1 if (q[mid] >= x) r = mid; else l = mid + 1; // 若无x,则二分出来的是最小值 // 因为如果x不存在,则>=x不会成立,l一直在变,则最终指向的为最小值q[l] } if (q[l] != x) cout << "-1 -1" << endl; else{ cout << l << " "; // 输出l或r都可,因为最后l=r int l = 0, r = n - 1;//lr重新赋值 while (l < r) // 尽量往右找 定义满足条件的为<=x的 { int mid = (l + r + 1) / 2; // 最后想要不要+1 if (q[mid] <= x) l = mid; else r = mid - 1; } cout << l << endl; // 输出l或r都可,因为最后l=r } } return 0; }
2.浮点数二分
// 浮点二分模板 // 没有边界问题,很简单 #include <iostream> using namespace std; int main() { double x; cin >> x; double l = -10000, r = 10000; // 这里范围为输入的数x的范围(题目给的) while (r - l > 1e-8) // 保留的精度一般比要求值多2 { // 或者while改成for(int i=0;i<100;i++),直接迭代100次 double mid = (l + r) / 2; // 没有边界问题,所以不用管+1(如果+1就不对了) if ((mid * mid * mid) >= x) r = mid; // 一定是r=mid else l = mid; } printf("%lf", l); // l或r都可 return 0; }