首页 > 编程语言 > AcWing算法基础课---第一讲基础算法---02二分

AcWing算法基础课---第一讲基础算法---02二分

时间:2022-08-22 15:29:12浏览次数:53  
标签:02 二分 while int double mid else --- 算法

整数二分模板

l = mid这个模板mid需要+1

int bsearch_1(int l, int r)
{
while (l < r)
{
int mid = l + r >> 1;
if (check(mid)) r = mid; // check()判断mid是否满足性质
else l = mid + 1;
}
return l;
}
// 区间[l, r]被划分成[l, mid - 1]和[mid, r]时使用:
int bsearch_2(int l, int r)
{
while (l < r)
{
int mid = l + r + 1 >> 1;
if (check(mid)) l = mid;
else r = mid - 1;
}
return l;
}

浮点数二分

double bsearch_3(double l, double r)
{
    const double eps = 1e-6;   // eps 表示精度,取决于题目对精度的要求
    while (r - l > eps)
    {
        double mid = (l + r) / 2;
        if (check(mid)) r = mid;
        else l = mid;
    }
    return l;
}

AcWing 790. 数的三次方跟

注意二分范围不是0到x因为当x小于1,三次方根会大于1

#include <iostream>

using namespace std;

int main()
{
    double x;
    cin >> x;
    if (x >= 0)
    {
        double l = -10000, r = 10000;
        while (r - l > 1e-7)
        {
            double mid = (l + r) / 2;
            if (mid * mid * mid >= x) r = mid;
            else l = mid;
        }
    
        printf("%.6lf", l);
    }
    else
    {
        x = -x;
        double l = -10000, r = 10000;
        while (r - l > 1e-7)
        {
            double mid = (l + r) / 2;
            if (mid * mid * mid >= x) r = mid;
            else l = mid;
        }
    
        printf("%.6lf", -l);
    }
    
    
    return 0;
}

AcWing 789. 数的范围

#include <iostream>

using namespace std;

const int N = 100010;

int n, m;
int q[N];

int main()
{
    scanf("%d%d", &n, &m);
    for (int i = 0; i < n; i ++) scanf("%d", &q[i]);
    
    while (m --)
    {
        int x;
        scanf("%d", &x);
        
        int l = 0, r = n - 1;
        while (l < r) // 先找起点
        {
            int mid = l + r >> 1;
            if (q[mid] >= x) r = mid;
            else l = mid + 1;
        }
        
        if (q[l] != x) cout << "-1 -1" << endl; // 数组中不包含这个数
        else 
        {
            cout << l << " ";
            int l = 0, r = n - 1;
            while(l < r) // 找终点
            {
                int mid = l + r + 1 >> 1;
                if (q[mid] <= x) l = mid;
                else r = mid - 1;
            }
            cout << l << endl;
            
        }
        
    }
    return 0;
}

标签:02,二分,while,int,double,mid,else,---,算法
From: https://www.cnblogs.com/hjy94wo/p/16612873.html

相关文章

  • ps2022(Photoshop 2022)Mac/win最新图像处理中文版
    AdobePhotoshop2022Mac/win是数字图像处理和编辑的行业标准,提供了全面的专业修饰工具包,并具有旨在激发灵感的强大编辑功能。Photoshop带有大量图像处理工具,旨在帮助您......
  • 参数校验---gin框架内置使用validator
    type SignUpParam struct {    Age       uint8 `json:"age" binding:"gte=1,lte=130"`    Name      string`json:"name" binding:"req......
  • 详解设备指纹核心算法
    大部分风险都来自于身份的不确定性。比如我们熟知的网络钓鱼、薅羊毛、账号窃取、注册登录等带来的盗用和欺诈都是其身份不确定性造成的直接后果。那么,如何保证你的身份......
  • python学习目录03-包的__init文件
    包的__init__操作#__init__.py文件:当导入包的时候,默认调用__init__.py文件#作用:#1.当导入包的时候,把一些初始化的函数,变量,类定义在__init__.py文件中......
  • 蔚来杯2022牛客暑期多校训练营加赛 题解
    E.Everyoneisbot对于后\(p\)个人,这\(p\)个人相互制约,一旦有一个人进行复读,剩下的\(p-1\)个人一定会进行复读,那么这个人就会被禁言,对于他来说不是最优策略。此时......
  • Stream流-流式思想概述和获取流
    流式思想概述整体来看,流式思想类似于工厂车间的“生产流水线”。  当需要对多个元素进行操作(特别是多步操作)的时候,考虑到性能及便利性,我们应该首先拼好一个“模型”......
  • Kibana - 总结
    参考资料1、官方网站:https://www.elastic.co/guide/en/kibana/current/index.htmlKibana介绍Kibana是一个开源的分析与可视化平台,设计出来用于和Elasticsearch一起使......
  • 2 Django-message组件
    假设:你正在做一个订单支付平台,其中用到了删除/撤销订单问题。想给予用户一些提示。可以用到Django的message组件。该组件通过第一次请求,写入提示信息并返回重定向,第二次请......
  • 具名插槽-动态传入数据
    父组件:<template><!--nav-bar只给一个插槽动态传入数据--><nav-bar><templatev-slot:[position]><ahref="#">注册</a></template></n......
  • CodeForces-1715D 2+ doors
    2+doors贪心位与位之间互不一向,因此考虑每个位进行考虑就行因为是或的关系,先考虑\(0\)的情况,如果出现\(0\),则两个数字的该位必然是\(0\)如果是\(1\)的情况,就考......