整数二分:注意边界问题
代码模板一 [l,r] --> [l,mid] [mid+1,r]
- 中间值:mid=(l+r)/2
- while(l<r)
- if(check(mid))
true r = mid
false l =mid+1- return l
代码模板二 [l,r] --> [l,mid-1] [mid,r]
- 中间值:mid=(l+r+1)/2 // 不加1时当r=l+1时,mid=l,true时l=mid死循环
- while(l<r)
- if(check(mid))
true l=mid
false r=mid-1- return l
//先不管其他事情写上
while(l<r)
{
int mid=(l+r)/2;
if(check) //在这里判断是不是需要l=mid,如果需要则 mid=(l+r+1)/2;
else
}
#include<iostream>
using namespace std;
int n,q,k;
int const N=100000;
int a[N];
int main()
{
cin>>n>>q;
for(int i=0;i<n;i++)cin>>a[i];
while(q--)
{
cin>>k;
int l=0,r=n-1;
while(l<r)
{
int mid=(l+r)/2;
if(a[mid]>=k) r=mid;
else l=mid+1;
}
if(a[l]!=k) cout<<"-1 -1"<<endl;
else
{
cout<<l<<" ";
l=0,r=n-1;
while(l<r)
{
int mid=(l+r+1)/2;
if(a[mid]<=k) l=mid;
else r=mid-1;
}
cout<<l<<endl;
}
}
}
浮点数二分:很简单,没有边界问题
// 求x的平方根
double x;
cin>>x;
double l=0,r=x;
while(r-l>1e-6) // 1e-(x+2) //x为要求精度
{
double mid=(l+r)/2;
if(mid*mid>=x) r=mid;
else l=mid;
}
cout<<l<<endl; //输出l或r都可以