首页 > 其他分享 >二分答案模板

二分答案模板

时间:2024-11-11 15:02:34浏览次数:1  
标签:二分 double float mid 1e 答案 模板

本篇主要介绍二分答案的几个模板

1.常用二分模板

整数二分模板1

  1. 将区间划分为[l,mid]和[mid+1,r]

  2. 则对应的边界更新操作为r=mid,和l=mid+1;

  3. 中点mid不要+1(相当于向下取整);

    //整数二分模板1
    int bsearch_1(int l,int r)
    {
        while(l < r)
        {
            mid = (l+r)>>1;
            if(check(mid))  r = mid;
            else    l = mid+1;
        }
        return l;
    }

整数二分模板2

  1. 将区间划分为[l,mid-1]和[mid,r]

  2. 则对应的边界更新操作为r=mid-1,和l=mid;

  3. 中点mid要+1(相当于向上取整);

    //整数二分模板2
    int bsearch_2(int l,int r)
    {
        while(l < r)
        {
            mid = (l+r+1)>>1;
            if(check(mid))  r = mid-1;
            else    l = mid;
        }
        return l;
    }

实数二分模板1

  1. 因为对实数而言,任意两个数中间都有无数个点存在,因此实数的二分都会有精度要求

    所以对于题目所给精度k,一般二分时的精度esp = 1e-(k+2);

    例如保留4位小数,则esp设置为1e-6;

  2. 因此实数二分查找的一般都是某个区间,对于一些点需要进行特殊的判定

  3. 然后关于左右区间的判定都与所写的check函数的条件有关

    double bsearch_d1(double l,double r)
    {
        double esp = 1e-6;//1e -(k+2),k为保留k位小数
        mid = (l+r)*0.5;//或mid = (l+r)/2;此时注意不能使用位运算
        while(r-l > esp)
        {
            if(check(mid))  r = mid;//去掉右区间
            else    l = mid;//去掉左区间
        }
        return l;
    }

实数二分模板2

  1. 基于实数的二分迭代无法进行彻底,只能将所求值在某个精度要求下近似

  2. 因此可以用近似迭代降低一部分精度,节省出一部分运行时间

  3. 根据某up主关于yxc的二分总结,迭代100次左右,结果基本稳定;代码如下:

    double bsearch_d1(double l,double r)
    {
        double esp = 1e-6;//1e -(k+2),k为保留k位小数
        for(int i = 1;i <= 100;i++)
        {
            double mid = (l+r)*0.5;
            if(check(mid))  r = mid;//去掉右区间
            else    l = mid;//去掉左区间
        }
        return l;
    }

eg1 洛谷P1024 [NOIP2001 提高组] 一元三次方程求解

[NOIP2001 提高组] 一元三次方程求解

题目描述

有形如:$a x^3 + b x^2 + c x + d = 0$ 这样的一个一元三次方程。给出该方程中各项的系数($a,b,c,d$ 均为实数),并约定该方程存在三个不同实根(根的范围在 $-100$ 至 $100$ 之间),且根与根之差的绝对值 $\ge 1$。要求由小到大依次在同一行输出这三个实根(根与根之间留有空格),并精确到小数点后 $2$ 位。

提示:记方程 $f(x) = 0$,若存在 $2$ 个数 $x_1$ 和 $x_2$,且 $x_1 < x_2$,$f(x_1) \times f(x_2) < 0$,则在 $(x_1, x_2)$ 之间一定有一个根。

输入格式

一行,$4$ 个实数 $a, b, c, d$。

输出格式

一行,$3$ 个实根,从小到大输出,并精确到小数点后 $2$ 位。

样例 #1

样例输入 #1

1 -5 -4 20

样例输出 #1

-2.00 2.00 5.00

提示

【题目来源】

NOIP 2001 提高组第一题

ac代码:
    #include<bits/stdc++.h>
    #define N 1005
    #define mod 998244353
    #define float double
    using namespace std;
    typedef long long ll;
    double a,b,c,d;
    float check(float m)
    {
        float num = a*m*m*m+b*m*m+c*m+d;
        return num ;
    }
    void solve()
    {
        cin>>a>>b>>c>>d;
        float x,ans;
        for(float i = -100;i <= 100;i++)//因为题目规定了答案区间,所以只需要在[-100,100]之间进行遍历
        {
            float l = i;
            float r = l+1;
            if(check(i)==0) cout<<fixed<<setprecision(2)<<i<<" ";//这里进行特殊判断就是上文中提到的对于实数二分只能确定某个区间然后从两侧近似,若区间 值恰好相等则进行特判
            else
            {
                if(check(l) * check(r) < 0)
                {
                    while((r-l) > 1e-4)//注意精度 esp = 1e -(k+2);
                    {
                        float mid = (l+r)/2;
                        if(check(l) * check(mid) <= 0)   r = mid;
                        else    l = mid;
                    }
                    cout<<fixed<<setprecision(2)<<l<<" ";//不使用printf的控制小数位数的方法
                }
            }
        }
    }
    int main()
    {
        ios::sync_with_stdio(false);
        cin.tie(nullptr);
        cout.tie(nullptr);
        solve();
        return 0;
    }

标签:二分,double,float,mid,1e,答案,模板
From: https://www.cnblogs.com/graspppp/p/18539614

相关文章

  • VUE3实现好看的通用网站源码模板
    文章目录1.设计来源1.1网站主界面1.2登录界面1.3注册界面1.4图文列表模板界面1.5简洁列表模板界面1.6文章内容左右侧模板界面1.7文章内容模板界面2.效果和源码2.1动态效果2.2源代码2.3目录结构源码下载万套模板,程序开发,在线开发,在线沟通作者:xcLeigh文章......
  • 20万字208道Java经典面试题总结(附答案)
    1、JDK和JRE有什么区别?JDK(JavaDevelopmentKit),Java开发工具包JRE(JavaRuntime Environment),Java运行环境JDK中包含JRE,JDK中有一个名为jre的目录,里面包含两个文件夹bin和lib,bin就是JVM,lib就是JVM工作所需要的类库。2、==和 equals 的区别是什么?对于基本类型,==比较的......
  • 【软考】系统架构设计师-2017年下半年下午论文真题及答案
    全国计算机技术与软件专业技术资格(水平)考试高级系统架构设计师2017年下半年下午试卷 论文  试题一 论软件架构风格软件体系结构风格是描述某一特定应用领域中系统组织方式的惯用模式。体系结构风格定义一个系统家族,即一个体系结构定义一个词汇表和一组约......
  • 【软考】系统架构设计师-2017年下半年下午案例真题及答案
    全国计算机技术与软件专业技术资格(水平)考试高级系统架构设计师2017年下半年下午试卷 案例试题一 阅读以下关于软件架构评估的叙述,在答题纸上回答问题 1 和问题 2 。【说明】某单位为了建设健全的公路桥梁养护管理档案,拟开发一套公路桥梁在线管理系统。在系......
  • 【模板】如何实现链表元素的反转
    反转链表是链表操作中一个经典的问题,也是面试中常见的考题。本文将从思路到实现一步步地讲解如何实现链表的反转,帮助初学者理解这一操作。我们将使用C++代码演示具体实现,同时分析时间复杂度和空间复杂度。问题定义给定一个单链表,我们需要将链表的节点顺序反转。例如,链表1......
  • 知识点扫盲:二分答案
    本条博客以及本系列用于记录算法学习中不熟悉或少见的知识点一.关于二分答案的来源和应用由于本大一==蒟蒻==没有经过系统性的学习,在一场牛客小白月赛中首次听说二分答案这一操作,十分震惊其效率与作用,遂写此篇来记录关于二分答案有关的概念[二分法]"https://oi-wiki.or......
  • 【模板】可持久化线段树 2(洛谷P3834)
    #include<bits/stdc++.h>#defineendl'\n'usingll=longlong;typedefunsignedlonglongull;usingnamespacestd;voidGordenGhost();constexprintN=2e5+7;intn,m,a[N],b[N];introot[N],tot;//根节点所有节点个数intls[N*40],rs[N*40],sum......
  • C#期中考试试题及答案
    C#期中考试试题及答案1.输入一个字符串,删除其中所有大写字母,输出删除后的字符串。stringstr=txtContent.Text;//首先获取用户输入的字符串123abcstringnewStr="";for(inti=0;i<str.Length;i++){ if(str[i]>='A'&&str[i]<='Z'){ continue; }e......
  • ROS2_机器人节点模板01_(万字?)_基于动作的实现
    事先声明在typora上做笔记时曾发生过数据丢失的问题,同时在转传到csdn上的时候也有轻微的问题,图片以及mermaid图。如果看的不够清晰可以留言,我将视情况提供原版markdown文件。一些建议请在阅读这份笔记时充分利用目录本笔记包含非常多拓展内容和衍生知识,你可以先阅读重......
  • 单调栈基础模板
    #include<bits/stdc++.h>usingnamespacestd;constintN=1000005;intn,ansl[N],ansr[N],a[N];intf[N],r,x;intmain(){cin>>n;for(inti=0;i<n;i++)cin>>a[i],ansl[i]=ansr[i]=-1;for(inti=0;i<n;i++){......