二分
二分的话,你真不懂也没必要一定搞懂(初赛,高中信息技术考试可能需要),真正打代码不需要搞懂二分。。
只要知道它是在有序数列里花log n 的时间找一个值就行了,
本质就是查找的优化
关于输出什么可能会不会,但基本知道这些就好了:
下面是找数字的二分模板(数据很小,随便写的)
#include <bits/stdc++.h> using namespace std; int a[105]; int main() { int n,x; cin>>n>>x; for(int i=1;i<=n;i++) cin>>a[i]; int l=0,r=n; while(l<r)//这里l<r 最后的结果就是l=r退出循环,如果是l<=r,最后就是l=r+1 { int mid=(l+r)>>1; if(a[mid]<x) l=mid+1; else r=mid-1; } cout<<r; return 0; }
假如数据不存在 如
5 3
1 2 4 5 6
只要稍微想想就好了:(按while(l<r)来)while终止之前肯定是l=2,r=3; 代入循环:a[(2+3)/2]=a[2]<3 所以 l=mid+1=3=r 退出循环
这样就好了,你不需要从开头一个个推。。。