二分两个 注意点
- 在求数字范围时 中点的确认
- 再求某以固定数字时 左右均为中点值
AcWing 789. 数的范围
AC代码及详解
//AcWing 789. 数的范围
#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
const int N=1e5+10;
int num[N];
int n,q;
int main(){
cin>>n>>q;
for(int i=0;i<n;i++)
cin>>num[i];
int number;
while(q--){
int l=0,r=n-1;
cin>>number;
//找到起始位置 mid 下取整
// 将r逐渐向mid靠拢并忽视 相等
//只有当小于才会出现l=mid+1从而找到 初始位置
while(l<r){
int mid=l+r>>1;
if(num[mid]>=number) r=mid;
else l=mid+1;
}
if(num[l]!=number) cout<<"-1 -1"<<endl;
else
{ cout<<l<<" ";
int l=0,r=n-1;
//找到重点位置 mid上取整
//原理同上
while(l<r){
int mid=l+r+1>>1;
if(num[mid]<=number) l=mid;
else r=mid-1;
}
cout<<l<<endl;
}
}
return 0;
}
AcWing 790. 数的三次方根
本质:就是 浮点数二分 值求立方最接近于 所求立方根的数
AC代码
#include<bits/stdc++.h>
using namespace std;
const double inf=1e-8;
int main(){
double x;
cin>>x;
double l=-1000,r=1000;
while(r-l>inf){
double mid=(l+r)/2;
if(mid*mid*mid<=x) l=mid;
else r=mid;
}
printf("%.06lf\n",r);
return 0;
}