1.自然语言描述
更合适地说,二分其实是一种思想。基本形式是从有序的很多个对象中将要寻找的对象择出来;每次迭代看当前区间的中间元素是否能满足需求条件(形象地理解为代入某个函数)根据结果判断要寻找的对象存在于左区间or右区间;重复进行直至左端点>=右端点。
利用二分在序列中进行查找称为二分查找(折半查找)。
2.代码描述
题目:Acwing.789 数的范围
题目链接
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int MAXN=1e5+10;
int n,q,s[MAXN];
int main(void)
{
cin>>n>>q;
for(int i=0;i<n;i++)
cin>>s[i];
while(q--){
int x;
cin>>x;
int l=0,r=n-1;//二分,寻找左端点
while(l<r){
int mid=l+r>>1;
if(x<=s[mid])//这里,若先考虑寻找元素<=中间元素,最终边界l是第一次出现的x的下标
r=mid;
else
l=mid+1;
}
if(s[l]==x)
cout<<l<<' ';
else{
cout<<"-1 -1"<<endl;
continue;
}
l=0,r=n-1;//二分,寻找右端点
while(l<r){
int mid=l+r+1>>1;
if(x>=s[mid])//同理,这种情况下,最终边界l是最后一次出现的x的下标
l=mid;
else
r=mid-1;
}
cout<<l<<endl;
}
return 0;
}
题目:Acwing.790 数的三次方
[题目链接](https://www.acwing.com/problem/content/792/)
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
double n;
int main(void)
{
cin>>n;
double l=-1e5,r=1e5;
while(r-l>1e-8){//浮点数边界条件一般设定为区间距离大于一个很小的数
double mid=(l+r)/2;
if(mid*mid*mid<=n)
l=mid;
else
r=mid;
}
printf("%.6lf",l);
return 0;
}