二分查找

输入 n 个不超过 10九次方 的单调不减的(就是后面的数字不小于前面的数字)非负整数 𝑎1,𝑎2,…,𝑎𝑛然后进行 m 次询问。对于每次询问,给出一个整数 𝑞

要求输出这个数字在序列中第一次出现的编号,如果没有找到的话输出 −1

这道题直接用std表中的函数即可

while(m--)
    {
        cin>>x;
        y=*lower_bound(a+1,a+1+n,x);
        z=lower_bound(a+1,a+1+n,x)-a;
        if(y!=x)cout<<"-1"<<" ";
        else cout<<z<<" ";
    }

但如果比较喜欢手搓二分的话:

l = 0, r = 0x3f3f3f3f3f3f3f;
while(l<=r){
    mid = (l + r) >> 1;
    if(ans<mid)
        r = mid - 1;
    else if(ans>mid)
        l = mid + 1;
    else
        break;
}
cout << ans << endl;

以上为原始二分,无加工。如果没有任何题目的束缚,最开始的二分算法长这样的。。。。。。。。。。

就像数学,随着时间,难度越大,变成了越来越陌生的样子。

posted @ 2024-05-18 10:07  DLSQS  阅读(43)  评论(0)    收藏  举报