A05 二分查找

 视频链接:A05 二分查找算法 最好的板子_哔哩哔哩_bilibili

 Luogu P2249 【深基13.例1】查找

// 我喜欢的板子
#include<cstdio>
using namespace std;
int n,m,q,a[1000005];

int find(int q){
  int l=0,r=n+1;//开区间
  while(l+1<r){ //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]);
  for(int i=1;i<=m;i++)
    scanf("%d",&q), printf("%d ",find(q));
  return 0;
}
// 我不喜欢的板子
#include<cstdio>
using namespace std;
int n,m,q,a[1000005];

int find(int q){
  int l=1,r=n;//闭区间
  while(l<r){ //l==r时结束
    int mid=l+r>>1;
    if(a[mid]>=q) r=mid; //最小化
    else l=mid+1;
  }
  return a[r]==q ? r : -1;
}
int main(){
  scanf("%d %d",&n,&m);
  for(int i=1;i<=n;i++)scanf("%d",&a[i]);
  for(int i=1;i<=m;i++)
    scanf("%d",&q), printf("%d ",find(q));
  return 0;
}
// 我不喜欢的板子
#include<cstdio>
using namespace std;
int n,m,q,a[1000005];

int find(int q){
  int ans=0;
  int l=1,r=n; //闭区间
  while(l<=r){ //l=r+1时结束
    int mid=l+r>>1;
    if(a[mid]>=q) ans=mid,r=mid-1; //最小化
    else l=mid+1;
  }
  return a[ans]==q ? ans : -1;
}
int main(){
  scanf("%d %d",&n,&m);
  for(int i=1;i<=n;i++)scanf("%d",&a[i]);
  for(int i=1;i<=m;i++)
    scanf("%d",&q), printf("%d ",find(q));
  return 0;
}
#include<cstdio>
#include<algorithm>
using namespace std;
int n,m,q,a[1000005];

int main(){
  scanf("%d %d",&n,&m);
  for(int i=1;i<=n;i++)scanf("%d",&a[i]);
  for(int i=1;i<=m;i++){
    scanf("%d",&q);
    int ans=lower_bound(a+1,a+n+1,q)-a; //最小化
    if(a[ans]==q) printf("%d ",ans);
    else printf("-1 ");
  }
  return 0;
}

Luogu P1024 [NOIP2001 提高组] 一元三次方程求解

#include<cstdio>
#include <algorithm>
double a,b,c,d;

double fun(double x){
  return a*x*x*x+b*x*x+c*x+d;
}
double find(double l,double r){
  while(r-l>0.0001){
    double mid=(l+r)/2;
    if(fun(mid)*fun(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=fun(i), y2=fun(i+1);
    if(!y1) printf("%.2lf ", 1.0*i); 
    if(y1*y2<0)printf("%.2lf ",find(i,i+1)); 
  }
  return 0;
}

 

posted @ 2023-01-31 17:14  董晓  阅读(1449)  评论(1编辑  收藏  举报