目录
整数二分
有单调性一定可以二分,没有单调性有可能可以二分
二分的本质
只要左右有不同的属性,就可以利用不同的模板来二分出他们(红色,绿色)的边界(箭头指向)
check()函数检查mid是否符合红色或者绿色性质,根据判断情况给了l和r赋值改变区间
注意mid = (l+r+1)/2还是(l+r)/2,根据选取l = mid,r = mid-1还是r = mid,l = mid+1来判断加还是不加1
主要整这么复杂是因为二分容易出现边界问题形成死循环,这么写可以避免
#include <iostream>
using namespace std;
int n,m;
const int N = 100000;
int q[N],temp[N];
int main()
{
cin >> n >> m;
for (int i = 0; i < n; i++)
{
cin >> q[i];
}
while (m--)
{
int x;
cin >> x;
int l = 0, r = n - 1;
while (l < r)
{
int mid = l + r >> 1;
if (q[mid] >= x)
r = mid;
else
l = mid + 1;
}
if (q[l] != x)
cout << "-1 -1" << endl;
else
{
cout << l;
int l = 0, r = n - 1;
while (l < r)
{
int mid = l + r + 1 >> 1;
if (q[mid] <= x)
l = mid;
else
r = mid - 1;
}
cout << " " << l<<endl;
}
}
return 0;
}
利用二分法求数的三次方根
#include <iostream>
using namespace std;
int n,m;
const int N = 100000;
int q[N],temp[N];
int main()
{
double x;
cin >> x;
double l = -10000, r = 10000;
while (r - l > 1e-8)
{
double mid = (l + r) / 2;
if (mid * mid * mid >= x)
r = mid;
else
l = mid;
}
printf("%lf\n", l);
return 0;
}