有单调性一定可以二分,二分不一定需要单调性
二分的本质是寻找边界
常用于求最值(可以求左最值或右最值)
数的范围
#include<bits/stdc++.h>
using namespace std;
const int N=100100;
int n,m;
int q[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)/2;
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)/2;
if(q[mid]<=x) l=mid;
else r=mid-1;
}
cout<<l<<endl;
}
}
return 0;
}
#include<bits/stdc++.h>
using namespace std;
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;//浮点数没有整除这种问题,不需要处理边界。如果直接加1 就意味着如果答案在(l,mid+1)之间 你是无法筛选的 为什么整数二分需要加一 是因为取mid时涉及向下取整 导致死循环 而浮点数二分的左右边界是严格可以缩小一半的
}
printf("%lf\n",l);//double在printf函数中是默认要输出6位小数,而在cout中是保留有效数(并且最多是六位有效数)
return 0;//l与r的值近似,输出哪个都可以
}