欢迎使用本站,预祝练习时长两年半的选手们到成功! [本模块信息来自tem/def/head]

class16 二分答案 lcy

时间:2024-07-29 09:15 作者:admin 点击:
1、初始化:找到数组的最小值和最大值 int low=a[0],high=a[n-1]; 2、找中间值: int mid=(low+high)/2; 3、比较: mid是否满足条件 满足,去掉一半 不满足,去掉一半 4、循环2-3步,直到剩下最后一

   1、初始化:找到数组的最小值和最大值

   int low=a[0],high=a[n-1];

   2、找中间值:

   int mid=(low+high)/2;

   3、比较:

       mid是否满足条件

           满足,去掉一半

           不满足,去掉一半

   4、循环2-3步,直到剩下最后一个

   5、如果找到了,输出答案,否则输出-1

int main(){

   int n,a[100050]={},m,b,ans;

   cin>>n;

   for(int i=1;i<=n;i++) cin>>a[i];

   cin>>m;

   while(m--){

       cin>>b;

       //最小值a[1] 最大值a[n]

       int l=1,r=n;

       //在1~n中,找最大的a[x],使得a[x]<b

       while(l<r){

           int x=(l+r+1)/2;//加1避免死循环  

           if(a[x]<b) l=x;//

           else r=x-1;

       }

       if(b-a[l]<=a[l+1]-b) cout<<a[l]<<endl;

       else cout<<a[l+1]<<endl;

   }

}

(责任编辑:admin)
    顶一下
    (0)
    0%
    踩一下
    (0)
    0%