洛谷 P2678 [NOIP2015 提高组] 跳石头(二分答案)

前提知识:

二分法往下其实有一些小分支,最常见的是二分查找,然后就是二分答案,浮点数二分等等

主要谈谈二分查找和二分答案的具体区别,我们不能光报个菜名随口就来,一问具体也说不出来个所以然。

前提:看到题目如果有单调性并且有边界的话,那就基本上就是二分法了

简单来说

二分查找:是我们在单调且有界的一堆数字中,找到我们要找的数字

二分答案:是我们在已知答案范围中,不断二分排除逼近,找到最后唯一的答案

如跳石头这道题,它要求我们返回最短跳跃距离,我们可以知道最短跳跃距离这个答案的范围一定是在距离为1到距离为L之间(这里是关键!!!)

情况一:因为最短跳跃距离的最小值只能是1,即要跳的第一块石头就在起点距离为1的位置上

此时如果需要移走的石头块数为0,那么返回的答案就是1(这就是最小极限答案为1的例子)

也就是说原来中间放了N块岩石,我偷懒,一块也不搬,原先怎么样,现在就怎么样

如果最小极限答案为0,那不就是在起点不跳了嘛,明显不符合题意

情况二:至于最短跳跃距离的最大值只能是L,即要跳的第一块石头就在终点的位置上,此时如果需要移走的石头块数为N,那么返回的答案就是L(这就是最大极限答案为L的例子)

也就是说原来中间放了N块岩石,我犯病,又把放的N块岩石又给全搬走了,让选手直接从起点跳到终点

一旦搞清楚这道题是二分答案,而且左右两个边界也找到了的话,那么就简单了

注:

很多时候我们用二分法很容易在边界处理的时候出现错误

总结了以下的技巧,都可以避免出现边界错误

一:初始化时,左边界为第一个元素的位置减一,右边界为最后一个元素的位置加一

例如本题左边界就应该为0,右边界就应该为L+1

二:循环条件为while(  left+1  !=  right )

三:循环跳出时会找到一条分界线来分开left和right(因为此时 left+1  ==  right )

四:最后随便选一个代入代码,例如选right,发现正确,那么答案就是right,发现错误,那么答案就是left

答案:

#include<stdio.h>
#define s 50001
int arr[s];
int L = 0, N = 0, M = 0;
int func(int mid)          //判断此时的最小距离是否满足题目
{int count = 0, now = 0, i = 0;      //i表示要跳的石头,now表示自己此时站的石头while (i < N + 1)                  //N+1是终点那块石头{i++;if (arr[i] - arr[now] < mid)     //如果此时两点距离小于假设的最小距离{count++;         //这块石头要搬}else           //我就跳过去(有点贪心算法的感觉,不用管后面会怎么样,能跳一块是一块){now = i;}}if (count > M)      //搬的石头过多,说明选择的最小距离大了{return 0;}else         //搬的石头没超过M,说明选择的最小距离可能小了或者刚好{return 1;}
}
int main()
{scanf("%d%d%d", &L, &N, &M);for (int i = 1; i <= N; i++)    //输入N个石头距离起点的长度{scanf("%d", &arr[i]);}arr[0] = 0;       //初始化起点arr[N + 1] = L;    //初始化终点int l = 0, r = L + 1;      //二分答案的左边界和右边界while (l + 1 != r){int mid = (l + r) / 2;if (func(mid))         //选的最小距离小了{l = mid;        //让最小距离更大一些}else         //选的最小距离大了{r = mid;      //让最小距离更小一些}}if (func(r))    //如果分界线右边的值代入进去正确{printf("%d\n", r);}else           //说明分界线右边的值是错误的,分界线左边的值才是对的{printf("%d\n", l);}return 0;
}

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

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

相关文章

GB28181 —— Ubuntu20.04下使用ZLMediaKit+WVP搭建GB28181流媒体监控平台(连接带云台摄像机)

最终效果 简介 GB28181协议是视频监控领域的国家标准。该标准规定了公共安全视频监控联网系统的互联结构, 传输、交换、控制的基本要求和安全性要求, 以及控制、传输流程和协议接口等技术要求,是视频监控领域的国家标准。GB28181协议信令层面使用的是SIP(Session Initiatio…

物联网手持终端机 超高频RFID手持终端工业级盘点PDA设备

在数字化时代&#xff0c;物联网手持终端机已经成为各行业不可或缺的工具。联强优创自主研发远距离手柄式超高频RFID读写手持终端&#xff0c;搭载高性能UHF读写模块&#xff0c;距离可达1-15米&#xff0c;基于IMPINJ E710芯片超高频模块与设备完美兼容&#xff0c;支持协议标…

图论基础(一)

一、图论 图论是数学的一个分支&#xff0c;它以图为研究对象。图论中的图是若干给定的点&#xff08;顶点&#xff09;以及连接两点的线&#xff08;边&#xff09;构成的图像&#xff0c;这种图形通常用来描述某些事物之间的某种特定关系&#xff0c;用点代表事物&#xff0c…

3.机器学习-十大算法之一线性回归算法(LinearRegression)原理讲解

3️⃣.机器学习-十大算法之一线性回归算法&#xff08;LinearRegression&#xff09;原理讲解 个人简介理解算法线性回归的一般模型 什么是线性&#xff1f;什么是非线性&#xff1f;什么是回归分析&#xff1f;损失函数算法优缺点优点缺点&#xff1a; 示例数学公式误差概率密…

Linux 内存管理概述(偏实战,略理论,附链接)

基础理论 1. 内存映射 可以参考&#xff1a; Linux内存映射 - 知乎 写的很详细&#xff0c;而且也有代码分析 2. 虚拟内存的空间分布 通过这张图你可以看到&#xff0c;用户空间内存&#xff0c;从低到高分别是五种不同的内存段。只读段&#xff0c;包括代码和常量等。数据段…

试用北大库博Cobot-SCA工具

最近试用北大软件工具的库博-SCA工具&#xff0c;其产品全称是库博软件成分分析与同源漏洞检测工具软件。这个产品名称有点长&#xff0c;至于原因&#xff0c;可能是为了与市场上其它SCA工具进行区分吧。北大库博SCA不是像大多数SCA工具&#xff0c;解析构建文件中的依赖组件进…

亿道丨三防平板丨手持平板丨加固平板丨助力地震救援

自土耳其发生7.8级大地震以来&#xff0c;一直都牵动着世人的心。2023年2月10日&#xff0c;据法新社最新消息&#xff0c;强震已造成土耳其和叙利亚两国超2万人遇难。报道称&#xff0c;相关官员和医护人员表示&#xff0c;地震造成土耳其17674人死亡&#xff0c;叙利亚则有33…

Linux--查看网络性能指标

一、性能指标有哪些&#xff1f; 带宽&#xff0c;表示链路的最大传输速率&#xff0c;单位是 b/s &#xff08;比特 / 秒&#xff09;&#xff0c;带宽越大&#xff0c;其传输能力就越强。延时&#xff0c;表示请求数据包发送后&#xff0c;收到对端响应&#xff0c;所需要的…

跟着cherno手搓游戏引擎【25】封装2DRenderer,封装shader传参,自定义Texture

封装2DRenderer&#xff1a; Renderer.h: #include"ytpch.h" #include"Renderer.h" #include <Platform/OpenGL/OpenGLShader.h> #include"Renderer2D.h" namespace YOTO {Renderer::SceneData* Renderer::m_SceneData new Renderer::S…

在IDEA中创建vue hello-world项目

工作中最近在接触vue前端项目&#xff0c;记录一下从0搭建一个vue hello world项目的步骤 1、本地电脑安装配置node、npm D:\Project\vue\hello-world>node -v v14.21.3 D:\Project\vue\hello-world>npm -v 6.14.18 D:\Project\vue\hello-world> 2、设置npm国内淘…

C语言指针总结2

前言 本篇博客紧接着指针总结1来总结下数组和指针的关系&#xff0c;让我们一起来看一下数组与指针的“爱恨情仇”。 欢迎关注个人主页&#xff1a;小张同学zkf 若有问题&#xff0c;评论区见 文章目录 1. 数组名的理解2. 使用指针访问数组3. 一维数组传参的本质4. 冒泡排序5.…

Layer1 明星项目 Partisia Blockchain 何以打造互操作、可创新的数字经济网络

我们的目标是创建一个以用户为中心的全新数字经济网络&#xff1a;在去信任化和公平透明的环境下&#xff0c;所有的隐私数据都能够得到天然保障&#xff0c;企业、用户等各角色的协作与共享将会更顺利地进行。 —— Partisia Blockchain 团队 作为一个以 Web3 安全为技术方向的…

数字化转型与制造企业绿色创新质量——基于供需双侧机制的再检验(2011-2022年)

参照马红&#xff08;2023&#xff09;的做法&#xff0c;本团队对来自软科学《数字化转型与制造企业绿色创新质量—基于供需双侧机制的再检验》一文中的基准回归部分进行复刻 一、数据介绍 数据名称&#xff1a;数字化转型与制造企业绿色创新质量 参考期刊&#xff1a;《软…

ClickHouse 指南(三)最佳实践 -- 跳数索引

Data Skipping Indexes Data Skipping Indexes 2 1、简介 影响ClickHouse查询性能的因素很多。在大多数情况下&#xff0c;关键因素是ClickHouse在计算查询WHERE子句条件时是否可以使用主键。因此&#xff0c;选择适用于最常见查询模式的主键对于有效的表设计至关重要。 然…

光学3D表面轮廓仪微纳米三维形貌一键测量

光学3D表面轮廓仪(白光干涉仪)利用白光干涉原理&#xff0c;以0.1nm分辨率精准捕捉物体的表面细节&#xff0c;实现三维显微成像测量&#xff0c;被广泛应用于材料学领域的研究和应用。 了解工作原理与技术 材料学领域中的光学3D表面轮廓仪&#xff0c;也被称为白光干涉仪&am…

05 动力云客之分页查询用户 + 查询用户详情 + 新增用户

1. 用户列表分页查询实现 核心 使用pageHelper实现分页 GetMapping(value "api/users")//分页的参数可以不传, 不传就默认设置为1public R userPage(RequestParam(value "current", required false) Integer current) {if (current null) {current …

STM32—PWM输出

目录 1 、 电路构成及原理图 2 、编写实现代码 main.c pwm.c 3、代码讲解 4、烧录到开发板调试、验证代码 5、检验效果 此笔记基于朗峰 STM32F103 系列全集成开发板的记录。 1 、 电路构成及原理图 PWM---Pulse Width Modulation&#xff0c;脉冲宽度调制&#xff0c;是…

通过跳板机拷贝远程服务器文件

## 背景 在日常开发或者运维中&#xff0c;经常会遇到开发环境与线上环境网络隔离&#xff0c;需要通过跳板机连接的场景&#xff0c;如果需要将目标机器上的定位信息搬迁到开发机做进一步排查时&#xff0c;经常取文件比较费劲&#xff0c;一般操作是将目标文件拷贝到跳板机&…

Bert-as-service 学习

pip3 install --user --upgrade tensorflow 安装遇到的问题如下&#xff1a; pip3 install --user --upgrade tensorflow 1052 pip uninstall protobuf 1053 pip3 uninstall protobuf 1054 pip3 install protobuf3.20.* 1055 pip3 install open-clip-torch2.8.2 1…

单片机精进之路-5矩阵键盘扫描

如下图&#xff0c;先在p3口输出0xfe&#xff0c;再读取p3口的电平&#xff0c;如果没有按键按下&#xff0c;temp & 0xf0还是0xf0&#xff0c;如果又第一个键按下&#xff0c;temp & 0xf0还是0xee&#xff0c;其他按键由此类推可得。 //4*4键盘检测程序,按下键后相应…