算法13、基础二分查找的应用(木根切割等)

news2025/1/5 19:17:05

🌰1、方程求根

晴问算法

  1️⃣即求f(x) = x^3 + x^2 + x - a = 0的根,又因为要求精确到0.01,所以eps至少设置为1e-3或者更小;

  2️⃣求导得3x^2 + 2x + 1 = 2x^2 + x^2 + 2x + 1 = 2x^2 + (x+1)^2  > 0, 所以f(x)是单调递增函数;

  3️⃣估计查找区间初值:因为a的取值区间是-100-100,所以我们让查找区间的初值为【-100 , 100】

这样一定能包含所有可能的解。

  对于闭区间【left, right]:

        若f(mid) > 0,说明mid比解大,则让right = mid;

        若 < 0, 说明mid比解小,则让left = mid;

  当right - left <= eps 则可跳出循环。返回left or mid, 即进入循环条件是right-left > eps,最终取两位小数输出

#include <iostream>
using namespace std;
const double EPS = 1e-3;//
int a;
double f(double x){
    return x*x*x + x*x + x -a ;
}
double binarySearch() {
    double left = -100, right = 100, mid;
    while (right - left > EPS) {
         mid = (left + right) / 2;
        if (f(mid) > 0) {
            right = mid;
        } else {
            left = mid;
        }
    }
    return left;//or mid,但是运行时间会更长。
}

int main() {
    cin >> a;
    printf("%.2f", binarySearch());
    return 0;
}

 🌰2、装水问题

晴问算法

1️⃣我们要求h,所以应当对h进行二分查找,又要求精确到2位小数,所以eps至少是1e-3;

2️⃣又显然随着h的增大,s1的面积也增大,所以当我们对h进行二分查找时,

        若s1/s2 > r说明s1过大了,应该缩小右边界,即让right = mid;

        若s1/s2 < r说明s1过小了,应该扩大左边界,即让left = mid;

当right - left <= eps,就找到了满足要求的解,跳出循环。返回左边界。输出带前2位小数的格式。

3️⃣二分查找区间的初值应该是[0, R], 因为它覆盖了h所有可能的取值。

为了统一代码,我们定义函数f(R, h) = s1/s2

#include <cstdio>
#include <cmath>
const double EPS = 1e-3;
const double PI = acos(-1.0);
double f(double R, double h) {
    double alpha = 2 * acos((R - h) / R);
    double L = 2 * sqrt(R * R - (R - h) * (R - h));
    double S1 = alpha * R * R / 2 - L * (R - h) / 2;
    double S2 = PI * R * R / 2;
    return S1 / S2;
}
double binarySearch(double R, double r){
    double left = 0, right = R, mid;
    while(right - left > EPS){
        mid = (left + right) / 2;
        if(f(R, mid) > r)
            right = mid;
        else
            left = mid;
    }
    return left;
}
int main(){
    int R;
    double r;
    scanf("%d%lf", &R, &r);
    printf("%.2lf\n", binarySearch(R, r));
}

🌰3、木棒切割问题

晴问算法

做法1-转化为基础二分查找

对切割后的长度l进行二分查找,设k为长度l下可得到的最大段数。

  转化思路:
        要求得到的段数至少K段,那么求最大长度也就是求:最后一个满足k>=K的length,再转化一下,就是求:第一个满足k<K的length, 再减1。这样就可以运用基础二分查找的思路找到第一个满足k<K的length了:

对于二分查找区间[left, right]:

        若k < K,说明mid有可能是解,但还需往左寻找,因为要求第一个满足k<K的length,那就让right = mid;

        若k >= K, 说明k过大,也就是length过小,那么就让left = mid + 1;

当left == right则找到了解,所以进入循环的条件是left < right.

  ⚠️除数不能为0:

  二分查找区间的初值本应该是[0, max(a[i]) ],即若返回值是0(0-1==-1)或者1(1-1==0),都说明无法达成,都应该输出0,所以应该额外判断返回值为0时,直接输出0不要再-1了。

  但是,由于计算当前mid可得到的最大段数用到了除法,除数length不能为0,

  因此,查找区间的初值应该从1开始,保证除数不会为0,即left应初始化为1.这样,最后就能够统一输出返回值-1,不需要额外判断返回值了。

返回left or right,最后将返回值-1得到最终结果。

#include <iostream>
using namespace std;
const int MAXN = 1005;
int a[MAXN];//存木棒长度
int n, K;
int Num(int length){
    int ans = 0;
    for(int i = 0; i < n; i++)
        ans += a[i] / length;//注意除法要求除数不为0!!
    return ans;
}
int binarySearch(int right){
    int left = 1, mid;
    while(left < right){
        mid =  (left + right ) / 2;
        if(Num(mid) < K)
            right = mid;
        else 
            left = mid + 1;
    }
    return left;// or right;
}
int main(){
    cin >> n >> K;
    int maxL = 0;
    for(int i = 0; i < n; i++){
        cin >> a[i];
        if(a[i] > maxL)
            maxL = a[i];
    }
    printf("%d\n", binarySearch(maxL)-1 );
}
做法2

  1️⃣题目要求切割后每根木棒的最大长度,那么就应该对切割后每根木棒的长度进行二分查找,那么查找区间初值为[0,max(木棒长度)]

  2️⃣又显然,要求切割后得到的木棒段数越多即k越大,长度就会越小,设函数Num(l)为长度为l时可得到的最多段数

对于二分查找区间[left, right]:

        若Num(mid) < k, 不满足至少k段的条件,说明mid不可能是解,且应该让k大一些,那就应该让mid小一点,即让right = mid -1;

        若Num(mid) >= k,满足至少k段的条件,说明mid有可能是解,但还需让mid大一点继续往右检查看是否还有更长的mid满足至少k段,那就让left = mid;

当left == right说明找到了最大长度即解,因此进入循环的条件应该是left < right;

最终应该返回left或者right;

Num(int length) = a1 / length + a2 / length + ……

注意,计算mid时,为了防止left=0,right=1时, 此时mid==0进入Num函数导致的除数为0,应该在此加上1再除以2,

        而且,若没加上1时,当right = left + 1时,设此时left = x, 那么mid = (left + right) /2会等于left==x, 若此时num(mid) >= k那么left = mid == x, 进入下一个循环又是mid=left==x, mid,left就会一直相等num(mid)结果一直不变导致死循环。

#include <iostream>
using namespace std;
const int MAXN = 1005;
int a[MAXN];//存木棒长度
int n, k;
int Num(int length){
    int ans = 0;
    for(int i = 0; i < n; i++)
        ans += a[i] / length;//注意除法要求除数不为0!!
    return ans;
}
int binarySearch(int right){
    int left = 0, mid;
    while(left < right){
        mid =  (left + right + 1) / 2;
        if(Num(mid) < k)
            right = mid - 1;
        else 
            left = mid;
    }
    return left;// or right;
}
int main(){
    cin >> n >> k;
    int maxL = 0;
    for(int i = 0; i < n; i++){
        cin >> a[i];
        if(a[i] > maxL)
            maxL = a[i];
    }

    printf("%d\n", binarySearch(maxL));
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2270454.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

麒麟信安云在长沙某银行的应用入选“云建设与应用领航计划(2024)”,打造湖湘金融云化升级优质范本

12月26日&#xff0c;2024云计算产业和标准应用大会在北京成功召开。大会汇集政产学研用各方专家学者&#xff0c;共同探讨云计算产业发展方向和未来机遇&#xff0c;展示云计算标准化工作重要成果。 会上&#xff0c;云建设与应用领航计划&#xff08;2024&#xff09;建云用…

LeetCode算法题——螺旋矩阵ll

题目描述 给你一个正整数n&#xff0c;生成一个包含1到n2所有元素&#xff0c;且元素按顺时针顺序螺旋排列的n x n正方形矩阵matrix 。 示例 输入&#xff1a;n 3 输出&#xff1a;[[1,2,3],[8,9,4],[7,6,5]]题解 思路&#xff1a; 将整个过程分解为逐圈填充的过程&#xf…

设计模式 创建型 原型模式(Prototype Pattern)与 常见技术框架应用 解析

原型模式&#xff08;Prototype Pattern&#xff09;是一种创建型设计模式&#xff0c;其核心思想在于通过复制现有的对象&#xff08;原型&#xff09;来创建新的对象&#xff0c;而非通过传统的构造函数或类实例化方式。这种方式在需要快速创建大量相似对象时尤为高效&#x…

word无法插入svg格式图片

插入后出现这样的窗口&#xff0c;表明word版本低&#xff0c;没有svg这个选项。 因此这就是区别。在b站找升级word视频。

mysql 报错 ERROR 1396 (HY000) Operation ALTER USER failed for root@localhost 解决方案

参考:https://blog.csdn.net/m0_74824534/article/details/144177078 mysql 修改密码 ALTER USER ‘root’‘localhost’ IDENTIFIED BY ‘123’; 时&#xff0c;报错 ERROR 1396 (HY000): Operation ALTER USER failed for rootlocalhost 解决方案&#xff1a; 2024-4-3 段子…

医学图像分割中故障检测方法的比较基准评测:揭示置信度聚合的作用|文献速递-视觉大模型医疗图像应用

Title 题目 Comparative benchmarking of failure detection methods in medical image segmentation: Unveiling the role of confidence aggregation 医学图像分割中故障检测方法的比较基准评测&#xff1a;揭示置信度聚合的作用 01 文献速递介绍 语义分割是医学图像分析…

线程-7-信号量

互斥访问高效从何谈起&#xff08;上节补充&#xff09; 效率要考虑整体效率 放/取数据时串行&#xff0c;但造数据/处理数据可以并行 多线程时&#xff1a;数据在交易场所中传输确实是互斥&#xff0c;串行的&#xff08;占比时间很短&#xff09; 但生产者获取数据与消费…

行业商机信息付费小程序系统开发方案

行业商机信息付费小程序系统&#xff0c;主要是整合优质行业资源&#xff0c;实时更新的商机信息。在当今信息爆炸的时代&#xff0c;精准、高效地获取行业商机信息对于企业和个人创业者而言至关重要。 一、使用场景 日常浏览&#xff1a;用户在工作间隙或闲暇时间&#xff0c…

Vue 全局事件总线:Vue 2 vs Vue 3 实现

&#x1f31f; 前言 欢迎来到我的技术小宇宙&#xff01;&#x1f30c; 这里不仅是我记录技术点滴的后花园&#xff0c;也是我分享学习心得和项目经验的乐园。&#x1f4da; 无论你是技术小白还是资深大牛&#xff0c;这里总有一些内容能触动你的好奇心。&#x1f50d; &#x…

活动预告 |【Part2】 Azure 在线技术公开课:迁移和保护 Windows Server 和 SQL Server 工作负载

课程介绍 通过 Microsoft Learn 免费参加 Microsoft Azure 在线技术公开课&#xff0c;掌握创造新机遇所需的技能&#xff0c;加快对 Microsoft 云技术的了解。参加我们举办的“迁移和保护 Windows Server 和 SQL Server 工作负载”活动&#xff0c;了解 Azure 如何为将工作负载…

Docker Compose 构建 EMQX 集群 实现mqqt 和websocket

EMQX 集群化管理mqqt真香 目录 #目录 /usr/emqx 容器构建 vim docker-compose.yml version: 3services:emqx1:image: emqx:5.8.3container_name: emqx1environment:- "EMQX_NODE_NAMEemqxnode1.emqx.io"- "EMQX_CLUSTER__DISCOVERY_STRATEGYstatic"- …

067B-基于R语言平台Biomod2模型的物种分布建模与数据可视化-高阶课程【2025】

课程培训包含&#xff1a;发票全套软件脚本学习数据视频文件导师答疑 本教程旨在通过系统的培训学习&#xff0c;学员可以掌握Biomod2模型最新版本的使用方法&#xff0c;最新版包含12个模型&#xff08;ANN, CTA, FDA, GAM, GBM, GLM, MARS, MAXENT, MAXNET, RF, SRE, XGBOOST…

USB 中断传输的 PID 序列

文章目录 中断传输的 PID 序列全速设备抓包高速设备抓包参考中断传输的 PID 序列 端点在初始化后,从 DATA0 开始,每成功执行一个事务,数据包序列翻转一次(从 DATA0 变为DATA1 或从 DATA1 变为 DATA0)。 数据翻转和传输的个数没有直接关系,只由端点在初始化后处理的总数决…

ESP32物联网无线方案,智能穿戴设备联网通信,产品无线交互应用

在物联网的世界里&#xff0c;每一个设备都不再是孤立的个体&#xff0c;它们通过无线连接芯片相互连接&#xff0c;形成一个庞大的智能网络。这些芯片是实现万物互联的基础&#xff0c;它们使得设备能够相互沟通&#xff0c;共享数据&#xff0c;从而创造出无限的可能性。 这…

C语言格式输出

1.转换字符说明&#xff1a; 2.常用的打印格式&#xff1a; 在 C 语言中&#xff0c;格式输出主要依靠 printf 函数来实现。以下是一些 C 语言格式输出的代码举例及相关说明。 printf("%2d"&#xff0c;123)&#xff0c;因为输出的部分有三位数&#xff0c;但是要求…

GJB系统设计说明模板

GJB系统设计说明模板及详解 1 范围 1.1 标识 1.2 系统概述 1.3 文档概述 2 引用文档 GJB XXX XXX XXX&#xff1b; XXX XXX。 前2章通用不再赘述 3 系统级设计决策 系统设计决策的目的:对系统规格说明中的关键需求(包括功能、质量属性和设计约束)进行分析,得到系统级概念性架构…

windows编译llama.cpp GPU版本

Build 指南 https://github.com/ggerganov/llama.cpp/blob/master/docs/build.md 一、Prerequire 具体步骤&#xff08;以及遇到的坑&#xff09;&#xff1a; 如果你要使用CUDA&#xff0c;请确保已安装。 1.安装 最新的 cmake, git, anaconda&#xff0c; pip 配置pyt…

Unity WebGL 部署IIS

Unity WebGL 部署IIS iis添加网站WebGL配置文件WebGL Gzip模式浏览器加载速度优化iis添加网站 第一步在配置好IIS并且添加网站 WebGL配置文件 在web包Build文件夹同级创建web.config文件 web.config文件内容 <?xml version="1.0" encoding="UTF-8"?…

职场常用Excel基础03-自定义排序

大家好&#xff0c;今天和大家一起分享一下excel中的自定义排序~ 通过排序&#xff0c;用户可以快速地对表格中的数据进行整理&#xff0c;以便更直观地观察趋势、查找特定信息或为后续的数据分析做准备。除了标准的升序和降序排序外&#xff0c;Excel还提供了强大的自定义排序…

每天40分玩转Django:Django类视图

Django类视图 一、知识要点概览表 类别知识点掌握程度要求基础视图View、TemplateView、RedirectView深入理解通用显示视图ListView、DetailView熟练应用通用编辑视图CreateView、UpdateView、DeleteView熟练应用Mixin机制ContextMixin、LoginRequiredMixin理解原理视图配置U…