蓝桥杯算法--二分查找算法最好的模板
B站视频链接:A05 二分查找算法 最好的板子_哔哩哔哩_bilibili
1、题目链接(模板):
【深基13.例1】查找 - 洛谷
#include <bits/stdc++.h>//万能头文件
using namespace std;
const int N=1000010;
int n,m,q,a[N];
int find(int q){
int l=0,r=n+1;//定义左右端点为开区间
while(l+1<r){
int mid=l+r>>1;
if(a[mid]>=q)r=mid;
else l=mid;
}
return a[r]==q ? r :-1;
}
int main(){
scanf("%d %d",&n,&m);
for(int i=1;i<=n;i++)scanf("%d",&a[i]);
while(m--){
scanf("%d",&q);
printf("%d ",find(q));
}
return 0;
}
2、求数的平方根:
#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 >= x) r = mid;
else l = mid;
}
printf("%lf\n", l);//double默认6位
return 0;
}
3、题目链接:[NOIP2001 提高组] 一元三次方程求解 - 洛谷
#include <bits/stdc++.h>
using namespace std;
double a,b,c,d;
double f(double x){
return a*x*x*x+b*x*x+c*x+d;
}
double find(double l,double r){
while(r-l>1e-4){//四位比结果多两位(结果要求保留两位)
double mid=(l+r)/2;//浮点数不能用>>1
if(f(mid)*f(r)<0)l=mid;
else r=mid;
}
return l;
}
int main(){
scanf("%lf%lf%lf%lf",&a,&b,&c,&d);
for(int i=-100;i<100;i++){
double y1=f(i),y2=f(i+1);
if(!y1)printf("%.2lf ",1.0*i);
if(y1*y2<0)printf("%.2lf ",find(i,i+1));
}
return 0;
}