A05 二分查找
视频链接:A05 二分查找算法 最好的板子_哔哩哔哩_bilibili
// 我喜欢的板子 #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; }