算法日记1:洛谷p2678跳石头(二分答案)
1、题目
二、题解:
2.1解题思路:
1.题目要求求出最小值最大,明显的二分答案题目,所以我们可以二分可以跳跃距离
int l=-1,r=L+1;
2.此时我们思考l=mid和r=mid的处理,当我们的check(mid)为true时候 表明我们此时的mid是符合要求的,
那么我们就要考虑是否可以变得更大呢?因此我们的二分答案可以这样写
int l=-1,r=L+1;while(l+1<r){int mid=(l+r)>>1;if(check(mid)) l=mid; //当check为true时,表示符合条件,我们就要考虑是否可以更大else r=mid;} if(check(r)) cout<<r<<'\n';else cout<<l<<'\n';
3.接下来,我们来处理check(mid)
函数
法一:好实现但是难想
首先我们定义一些变量来处理问题
int cnt=0; //计数器
int i=0,now=0; //i-->枚举每一个石头,now表示当前跳到了哪一个石头上
接下来,我们枚举每一个石头,
1.并且我们无论如何都会往下枚举,所以i++是永恒成立的
2.那么问题来了,我们如何实现把一个石头给踢掉的操作呢?2.1.答案是通过操作cnt和now,因为当需要踢掉这个石头的时候,一定需要+1的,所以cnt++;
但是我们此时不一定可以让now=i,因为我们可能会出现需要搬走连续的两个石头,所以只有当
a[i]-a[now]>mid,我们才会跳跃
代码解析
bool check(int mid) //检查此时这个距离是否可以达成
{int cnt=0; //计数器int i=0,now=0; //i-->枚举每一个石头,now表示当前跳到了哪一个石头上while(i<n+1) //枚举每一个石头{i++;if(a[i]-a[now]<mid) //表明此时的距离不满足要求{cnt++; //纯让次数加1,也就是当作把这块石头踢掉,因为我此时i++是必然会进行的,//但是我的now没有改变也就意味着这块石头我没有跳,遍历到了下一块石头。}else //表明此时距离已经>mid可以跳跃{now=i; //}}if(cnt<=m) return true;else return false;
}
法二(好想但是难实现):
首先我们定义一些变量来处理问题
int cnt=0; //计数器
int i=0,now=0; //i-->枚举每一个石头,now表示当前跳到了哪一个石头上
接下来,我们枚举每一个石头,
1.并且我们无论如何都会往下枚举,所以i++是永恒成立的
2.那么问题来了,我们如何实现把一个石头给踢掉的操作呢?2.1:在法一中,我们通过cnt的处理来抽象的实现跳跃这个操作
但是我们仍然可以用一个whle死循环来实现两个/两个以上的连续石头不符合条件的情况
我们把if
–>while
,这样,当出循环时,就一定使得此时的下一个石头的距离是合理的。
PS:注意此时需要防止i的遍历溢出!!!
代码如下😂:
bool check(int mid) //检查此时这个距离是否可以达成
{int cnt=0; //计数器int i=0,now=0; //i-->枚举每一个石头,now表示当前跳到了哪一个石头上while(i<n+1) //枚举每一个石头{i++;while(a[i]-a[now]<mid) //表明此时的距离不满足要求{cnt++;if(i<n+1) //还没遍历完成{i++; //防止都不满足溢出}else //表明此时i已经遍历完了n,那么就直接进行判断{if(cnt<=m) return true;else return false;}}now=i; //表示跳到这个石头上面}if(cnt<=m) return true;else return false;
}
三、完整代码解析
法一:
#include<iostream>
using namespace std;const int N=2e5;
int a[N];
int L,n,m;bool check(int mid) //检查此时这个距离是否可以达成
{int cnt=0; //计数器int i=0,now=0; //i-->枚举每一个石头,now表示当前跳到了哪一个石头上while(i<n+1) //枚举每一个石头{i++;if(a[i]-a[now]<mid) //表明此时的距离不满足要求{cnt++; //纯让次数加1,也就是当作把这块石头踢掉,因为我此时i++是必然会进行的,//但是我的now没有改变也就意味着这块石头我没有跳,遍历到了下一块石头。}else //表明此时距离已经>mid可以跳跃{now=i; //}}if(cnt<=m) return true; //(踢石头数<可以踢的数量) 满足条件else return false;
}int main()
{cin>>L>>n>>m;for(int i=1;i<=n;i++){cin>>a[i];}a[n+1]=L; //样例准备int l=-1,r=L+1;while(l+1<r){int mid=(l+r)>>1;if(check(mid)) l=mid;else r=mid;}if(check(r)) cout<<r<<'\n';else cout<<l<<'\n';return 0;
}
法二:
#include<iostream>
using namespace std;const int N=2e5;
int a[N];
int L,n,m;bool check(int mid) //检查此时这个距离是否可以达成
{int cnt=0; //计数器int i=0,now=0; //i-->枚举每一个石头,now表示当前跳到了哪一个石头上while(i<n+1) //枚举每一个石头{i++;while(a[i]-a[now]<mid) //表明此时的距离不满足要求{cnt++;if(i<n+1) //还没遍历完成{i++; //防止都不满足溢出}else //表明此时i已经遍历完了n,那么就直接进行判断{if(cnt<=m) return true;else return false;}}now=i; //表示跳到这个石头上面}if(cnt<=m) return true;else return false;
}int main()
{cin>>L>>n>>m;for(int i=1;i<=n;i++){cin>>a[i];}a[n+1]=L; //样例准备int l=-1,r=L+1;while(l+1<r){int mid=(l+r)>>1;if(check(mid)) l=mid;else r=mid;}if(check(r)) cout<<r<<'\n';else cout<<l<<'\n';return 0;
}
相关文章:

算法日记1:洛谷p2678跳石头(二分答案)
1、题目 二、题解: 2.1解题思路: 1.题目要求求出最小值最大,明显的二分答案题目,所以我们可以二分可以跳跃距离int l-1,rL1; 2.此时我们思考lmid和rmid的处理,当我们的check(mid)为true时候 表明我们此时的mid是符合要求的, 那么…...

Unity shader中真的可以动态关闭Stencil Test吗?
这个问题很多年前就有人问了: https://discussions.unity.com/t/how-to-disable-the-stencil-block-via-shader-properties/600273/1 最后的答案是: set [_StencilComp] to CompareFunction.Disabled to disable the Stencil Op completely. 但是我测试…...

YOLOv9改进,YOLOv9自研检测头融合HyCTAS的Self_Attention自注意力机制,2024,适合目标检测、分割任务
摘要 论文提出了一种新的搜索框架,名为 HyCTAS,用于在给定任务中自动搜索高效的神经网络架构。HyCTAS框架结合了高分辨率表示和自注意力机制,通过多目标优化搜索,找到了一种在性能和计算效率之间的平衡。 # 理论介绍 自注意力(Self-Attention)机制是HyCTAS框架中的一个…...

计算机网络 (36)TCP可靠传输的实现
前言 TCP(传输控制协议)是一种面向连接的、可靠的、基于字节流的传输层通信协议。TCP通过多种机制实现可靠传输,这些机制主要包括连接管理、序列号和确认应答机制、重传机制、流量控制、拥塞控制等。 一、连接管理 TCP使用三次握手࿰…...

Git版本控制 - 创建使用Repository
Git版本控制 – 创建使用Repository Version Control with Git - Create and Use Repository By JacksonML 上文提到,Git是一种分布式版本控制系统。作为全球范围内广泛使用的工具,如何将项目分步骤运用到其中呢? 本文简要介绍如何用Git工…...

MySQL —— 在CentOS9下安装MySQL
MySQL —— 在CentOS9下安装MySQL 1.查看自己操作系统的版本2.找到对应的安装源3.上传我们在windows下,下载的文件,解压4.执行rpm命令,启用MySQL8仓库5.执行dnf install -y mysql-community-server6.设置开机自启动7.获得初始密码8.登录MySQL…...

LeetCode 热题 100_腐烂的橘子(52_994_中等_C++)(图;广度优先遍历(队列))
LeetCode 热题 100_腐烂的橘子(52_994) 题目描述:输入输出样例:题解:解题思路:思路一(广度优先遍历(队列)): 代码实现代码实现(思路一…...

Nginx 可观测性最佳实践
Nginx 介绍 Nginx 是一个开源、轻量级、高性能的 HTTP 和反向代理服务器,也可以用于 IMAP/POP3 代理服务器。Nginx 因其采用的异步非阻塞工作模型,使其具备高并发、低资源消耗的特性。高度模块化设计也使得 Nginx 具备很好的扩展性,在处理静…...

LabVIEW光流跟踪算法
1. 光流跟踪算法的概述 光流(Optical Flow)是一种图像处理技术,用于估算图像中像素点的运动。通过比较连续帧图像,光流算法可以分析图像中的运动信息,广泛用于目标跟踪、运动检测和视频处理等场景。该示例使用了NI Vi…...
Jira用例自动去除summary重复用例
title: Jira用例自动去除summary重复用例 tags: - jira - python categories: - python一、背景与需求二、解决方案思路三、实施步骤本文永久更新地址: 在使用 Jira 进行项目管理时,测试用例的维护至关重要。随着项目推进,用例数量增多,可能…...
基于openEuler22.03SP4部署Prometheus+Grafana
测试环境 Virtual Box,openEuler-22.03-LTS-SP4-x86_64-dvd.iso,4 vCPU, 8G RAM, 60 vDisk。最小化安装。需联网。 系统环境 关闭防火墙 systemctl stop firewalld systemctl disable firewalld systemctl status firewalld selinux关闭 sed -ri…...

泛目录和泛站有什么差别
啥是 SEO 泛目录? 咱先来说说 SEO 泛目录是啥。想象一下,你有一个巨大的图书馆,里面的书架上摆满了各种各样的书,每一本书都代表着一个网页。而 SEO 泛目录呢,就像是一个超级图书管理员,它的任务就是把这些…...
css 布局及动画应用(flex+transform+transition+animation)
文章目录 css 布局及动画应用animationtransform,transition,animation 综合应用实例代码实例解释 css 布局及动画应用 Display用法 作用:用于控制元素的显示类型,如块级元素、内联元素、无显示等。常见属性值及示例:…...

springboot vue uniapp 仿小红书 1:1 还原 (含源码演示)
线上预览: 移动端 http://8.146.211.120:8081/ 管理端 http://8.146.211.120:8088/ 小红书凭借优秀的产品体验 和超高人气 目前成为笔记类产品佼佼者 此项目将详细介绍如何使用Vue.js和Spring Boot 集合uniapp 开发一个仿小红书应用,凭借uniapp 可以在h5 小程序 app…...
lombok在高版本idea中注解不生效的解决
环境: IntelliJ IDEA 2024.3.1.1 Spring Boot Maven 问题描述 使用AllArgsConstructor注解一个用户类,然后调用全参构造方法创建对象,出现错误: java: 无法将类 com.itheima.pojo.User中的构造器 User应用到给定类型; 需要:…...

跨境电商领域云手机之选:亚矩阵云手机的卓越优势
在跨境电商蓬勃发展的当下,云手机已成为众多企业拓展海外市场的得力助手。亚矩阵云手机凭借其独特优势,在竞争激烈的云手机市场中崭露头角。不过,鉴于市场上云手机服务供应商繁多,企业在抉择时需对诸多要素予以审慎考量。 跨境电商…...

Linux第二课:LinuxC高级 学习记录day02
2.4、shell中的特殊字符 2.4.4、命令置换符 或者 $() 反引号:esc下面的按键,英文状态下直接按 功能:将一个命令的输出作为另一个命令的参数 echo 不会认为hostname是一个命令 加上 之后,先执行hostname,拿到主机名…...
6. NLP自然语言处理(Natural Language Processing)
自然语言是指人类日常使用的语言,如中文、英语、法语等。 自然语言处理是人工智能(AI)领域中的一个重要分支,它结合了计算机科学、语言学和统计学的方法,通过算法对文本和语音进行分析,使计算机能够理解、解…...

win10电脑 定时关机
win10电脑 定时关机 https://weibo.com/ttarticle/p/show?id2309405110707766296723 二、使用任务计划程序设置定时关机打开任务计划程序: 按下“Win S”组合键,打开搜索框。 在搜索框中输入“任务计划程序”,然后点击搜索结果中的“任务…...
linux删除用户
1、查看账号 cat /etc/passwd 查看所有用户账号信息:该文件记录了系统中的所有用户账号信息,包括用户名、用户ID、用户所属组等。 2、删除账号 基本删除:使用userdel命令删除用户账号,格式为userdel [选项] 用户名。如果不加任…...

深度学习在微纳光子学中的应用
深度学习在微纳光子学中的主要应用方向 深度学习与微纳光子学的结合主要集中在以下几个方向: 逆向设计 通过神经网络快速预测微纳结构的光学响应,替代传统耗时的数值模拟方法。例如设计超表面、光子晶体等结构。 特征提取与优化 从复杂的光学数据中自…...

超短脉冲激光自聚焦效应
前言与目录 强激光引起自聚焦效应机理 超短脉冲激光在脆性材料内部加工时引起的自聚焦效应,这是一种非线性光学现象,主要涉及光学克尔效应和材料的非线性光学特性。 自聚焦效应可以产生局部的强光场,对材料产生非线性响应,可能…...
进程地址空间(比特课总结)
一、进程地址空间 1. 环境变量 1 )⽤户级环境变量与系统级环境变量 全局属性:环境变量具有全局属性,会被⼦进程继承。例如当bash启动⼦进程时,环 境变量会⾃动传递给⼦进程。 本地变量限制:本地变量只在当前进程(ba…...
树莓派超全系列教程文档--(62)使用rpicam-app通过网络流式传输视频
使用rpicam-app通过网络流式传输视频 使用 rpicam-app 通过网络流式传输视频UDPTCPRTSPlibavGStreamerRTPlibcamerasrc GStreamer 元素 文章来源: http://raspberry.dns8844.cn/documentation 原文网址 使用 rpicam-app 通过网络流式传输视频 本节介绍来自 rpica…...
【Java学习笔记】Arrays类
Arrays 类 1. 导入包:import java.util.Arrays 2. 常用方法一览表 方法描述Arrays.toString()返回数组的字符串形式Arrays.sort()排序(自然排序和定制排序)Arrays.binarySearch()通过二分搜索法进行查找(前提:数组是…...
QMC5883L的驱动
简介 本篇文章的代码已经上传到了github上面,开源代码 作为一个电子罗盘模块,我们可以通过I2C从中获取偏航角yaw,相对于六轴陀螺仪的yaw,qmc5883l几乎不会零飘并且成本较低。 参考资料 QMC5883L磁场传感器驱动 QMC5883L磁力计…...
线程与协程
1. 线程与协程 1.1. “函数调用级别”的切换、上下文切换 1. 函数调用级别的切换 “函数调用级别的切换”是指:像函数调用/返回一样轻量地完成任务切换。 举例说明: 当你在程序中写一个函数调用: funcA() 然后 funcA 执行完后返回&…...
是否存在路径(FIFOBB算法)
题目描述 一个具有 n 个顶点e条边的无向图,该图顶点的编号依次为0到n-1且不存在顶点与自身相连的边。请使用FIFOBB算法编写程序,确定是否存在从顶点 source到顶点 destination的路径。 输入 第一行两个整数,分别表示n 和 e 的值(1…...

以光量子为例,详解量子获取方式
光量子技术获取量子比特可在室温下进行。该方式有望通过与名为硅光子学(silicon photonics)的光波导(optical waveguide)芯片制造技术和光纤等光通信技术相结合来实现量子计算机。量子力学中,光既是波又是粒子。光子本…...
Xen Server服务器释放磁盘空间
disk.sh #!/bin/bashcd /run/sr-mount/e54f0646-ae11-0457-b64f-eba4673b824c # 全部虚拟机物理磁盘文件存储 a$(ls -l | awk {print $NF} | cut -d. -f1) # 使用中的虚拟机物理磁盘文件 b$(xe vm-disk-list --multiple | grep uuid | awk {print $NF})printf "%s\n"…...