ch0(简单实用算法篇)——二分

1.自然语言描述
更合适地说,二分其实是一种思想。基本形式是从有序的很多个对象中将要寻找的对象择出来;每次迭代看当前区间的中间元素是否能满足需求条件(形象地理解为代入某个函数)根据结果判断要寻找的对象存在于左区间or右区间;重复进行直至左端点>=右端点。
利用二分在序列中进行查找称为二分查找(折半查找)。

2.代码描述
题目:Acwing.789 数的范围
题目链接

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>

using namespace std;

const int MAXN=1e5+10;
int n,q,s[MAXN];

int main(void)
{
    cin>>n>>q;
    
    for(int i=0;i<n;i++)
        cin>>s[i];
        
    while(q--){
        
        int x;
        cin>>x;
        
        int l=0,r=n-1;//二分,寻找左端点
        while(l<r){
            int mid=l+r>>1;
            if(x<=s[mid])//这里,若先考虑寻找元素<=中间元素,最终边界l是第一次出现的x的下标
                r=mid;
            else
                l=mid+1;
        }
        
        if(s[l]==x)
            cout<<l<<' ';
        else{
            cout<<"-1 -1"<<endl;
            continue;
        }
        
        l=0,r=n-1;//二分,寻找右端点
        while(l<r){
            int mid=l+r+1>>1;
            if(x>=s[mid])//同理,这种情况下,最终边界l是最后一次出现的x的下标
                l=mid;
            else
                r=mid-1;
        }
        cout<<l<<endl;
        
    }
    
    return 0;
}
题目:Acwing.790 数的三次方
[题目链接](https://www.acwing.com/problem/content/792/)
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>

using namespace std;

double n;

int main(void)
{
    cin>>n;
    
    double l=-1e5,r=1e5;
    while(r-l>1e-8){//浮点数边界条件一般设定为区间距离大于一个很小的数
        double mid=(l+r)/2;
        if(mid*mid*mid<=n)
            l=mid;
        else
            r=mid;
    }
    
    printf("%.6lf",l);
    
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值