二分
左边界模板 找第一个大于等于x的数
while(l < r) { mid = l+r >> 1; if(a[mid].s >= k) r = mid; else l = mid + 1; } if(a[l].s == k) cout << a[l].num << " "; else { cout << "-1 -1" << endl; continue; }
右边界模板 找第一个小于等于x的数
while(l < r) { mid = l+r+1 >> 1;//注意加一,否则会陷入死循环 if(a[mid].s <= k) l = mid; else r = mid - 1; } if(a[l].s == k) cout << a[l].num << " " << endl; else { cout << "-1 -1" << endl; continue; }
题目:https://www.acwing.com/problem/content/description/791/
数的三次方根
题目:https://www.acwing.com/problem/content/792/
原理还是使用的是二分的思想
#include<iostream> using namespace std; double n; int main() { scanf("%lf", &n); double l = -10000; double r = 10000; double mid; while(r - l >= 1e-8) { mid = (l+r)/2; if(mid*mid*mid >= n) r = mid; else l = mid; } printf("%lf", mid); return 0; }

浙公网安备 33010602011771号