《从入门到精通:蓝桥杯编程大赛知识点全攻略》(五)-数的三次方根、机器人跳跃问题、四平方和
本博客将详细探讨如何通过二分查找算法来解决这几个经典问题。通过几个实际的例子,我们将展示如何在这些问题中灵活应用二分查找,优化计算过程,并在面对大数据量时保持高效性。
目录
前言
数的三次方根
算法思路
代码如下
机器人跳跃问题
算法思路
代码如下
四平方和
算法思路
代码如下
总结
前言
本博客将详细探讨如何通过二分查找算法来解决这几个经典问题。通过几个实际的例子,我们将展示如何在这些问题中灵活应用二分查找,优化计算过程,并在面对大数据量时保持高效性。
数的三次方根
给定一个浮点数 n,求它的三次方根。
输入格式
共一行,包含一个浮点数 n。
输出格式
共一行,包含一个浮点数,表示问题的解。
注意,结果保留 6 位小数。
数据范围
−10000≤n≤10000
输入样例:
1000.00
输出样例:
10.000000
算法思路

这道题题很多思路。 这次主要通过二分来进行处理,锻加强二分的练习。设置两个double类型变量lleft = -10000,right = 10000;取中间值mid,当mid * mid * mid >= x的时候,说明右区间的值太大,在[left,mid]中寻找。如果mid * mid * mid < x,说明需要在(mid,right]区间里面找,最后的答案输出left或者right都可。(注意题目精度,结果要6位小数,那么循环判断的时候增加两位精度即1e-8即可)
代码如下
import java.io.*;public class Main {static PrintWriter pw = new PrintWriter(new OutputStreamWriter(System.out));static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));static StreamTokenizer st = new StreamTokenizer(br);public static void main(String[] args)throws Exception {double x = nextDouble();double left = -10000;double right = 10000; while (right - left > 1e-8) { //1e-8表示的题目精度,随题目变化而变化,一般比所求答案高两个精度double mid = (left + right) / 2;if(mid * mid * mid >= x){right = mid;}else {left = mid;}}pw.printf("%.6f", right);pw.flush();}public static double nextDouble()throws Exception{st.nextToken();return (double)st.nval;}
}
机器人跳跃问题
机器人正在玩一个古老的基于 DOS 的游戏。
游戏中有 N+1 座建筑——从 0到 N 编号,从左到右排列。
编号为 0 的建筑高度为 0个单位,编号为 i 的建筑高度为 H(i) 个单位。
起初,机器人在编号为 0 的建筑处。
每一步,它跳到下一个(右边)建筑。
假设机器人在第 k 个建筑,且它现在的能量值是 E,下一步它将跳到第 k+1个建筑。
如果 H(k+1)>E,那么机器人就失去 H(k+1)−E 的能量值,否则它将得到 E−H(k+1)的能量值。
游戏目标是到达第 N 个建筑,在这个过程中能量值不能为负数个单位。
现在的问题是机器人至少以多少能量值开始游戏,才可以保证成功完成游戏?
输入格式
第一行输入整数 N。
第二行是 N 个空格分隔的整数,H(1),H(2),…,H(N) 代表建筑物的高度。
输出格式
输出一个整数,表示所需的最少单位的初始能量值上取整后的结果。
数据范围
1≤N,H(i)≤10^5
输入样例1:
5
3 4 3 2 4
算法思路

根据图示的推论 可知,其实无论哪一种情况最后E能量的变化都为2*E-h(i);与此同时当我们发现,如果E满足题意,那么E1 >= E,那么E1也是满足题意的。此时答案E就具有的单调性。

根据图示的推论,那么我们就知道答案E的最大值一定不超过100000,最小值大于等于0;可以用二分的方式来进行计算。
用整型数组arr记录每个建筑的能量值,用整型变量n来记录建筑数,左边界left = 0;右边界right = 100000;当left < right时,开始循环,找到中间值mid = (left + right) / 2;然后检查此时的mid值是否符合要求;
检查函数check,传过来的值E能量,然后从1遍历到n,计算e = 2 * e - arr[i];然后判断此时的e是否小于0,小于0直接不符合要求,返回false;当e >= 100000时,相当于满足题意了,一定成功可以提前返回true。循环结束时,返回true,表示满足题意。
当判断mid为true时说明此时的区间(mid,right]区间内,一定是E的值比mid大,最后答案要的是mid的最小值,说明右区间不可能存在,故右边界左移即right = mid;当mid不合格,说明区间[left,mid]中所有的E都不符合题意,故正确答案一定在右区间,所以左区间右移即left = mid + 1;最后输出left即为最后的答案。
代码如下
import java.io.*;
public class Main {static PrintWriter pw = new PrintWriter(new OutputStreamWriter(System.out));static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));static StreamTokenizer st = new StreamTokenizer(br);static int N = 100010;static int[] arr = new int[N];static int n;public static void main(String[] args)throws Exception {n = nextInt();for (int i = 1; i <= n; i++) {arr[i] = nextInt();}int left = 0;int right =100000;while (left < right) {int mid = (left + right) / 2;if(check(mid)){right = mid;}else {left = mid + 1;}}pw.println(left);pw.flush();}public static boolean check(int e){for(int i = 1;i <= n;i++){e = e * 2 - arr[i];//只要大于等于e的最大值,那么必然符合条件if(e >= 100000){return true;}if(e < 0){return false;}}return true;}public static int nextInt()throws Exception {st.nextToken();return (int) st.nval;}
}
四平方和
四平方和定理,又称为拉格朗日定理:
每个正整数都可以表示为至多 4 个正整数的平方和。
如果把 0 包括进去,就正好可以表示为 4 个数的平方和。
比如:
对于一个给定的正整数,可能存在多种平方和的表示法。
要求你对 4 个数排序:
0≤a≤b≤c≤d
并对所有的可能表示法按 a,b,c,d 为联合主键升序排列,最后输出第一个表示法。
输入格式
输入一个正整数 N。
输出格式
输出4个非负整数,按从小到大排序,中间用空格分开。
数据范围
0<N<5*10^6
输入样例:
5
输出样例:
0 0 1 2
算法思路
暴力做法直接枚举前3个数a、b、c,最后一个d可以直接算,因为d是算出来的,可能为小数,还需判断一下
,当条件成立是就是最后的答案。(但这道题枚举3层循环会超时。)

二分优化做法。
先枚举所有c、d的情况,然后将c、d、c*c+d*d 3个值存起来,再去枚举a、b的情况,然后将 t = n - a * a - b * b与对应的c*c+d*d做对比,找出正确的答案。
引入整型变量n才存储最后的结果,用两层循环来枚举c和d,用一类内部类Sum来存储c、d和sum(存储c*c+d*d);每枚举一个c和d,将3个值存储list列表。循环结束后,按照宿命从小到大,当sum相同时按照c从小到大,当c相同时按照d从小到大。
然后再用两次循环枚举a和b,用整型变量t来存储n - a * a - b * b;用二分来查找,左边界left0,右边界list列表的长度-1;当列表list中的下标为mid的sum >= t,此时说明答案在左区间,此时右边界左移right = mid;当list中的下标为mid的sum < t,说明答案在右区间且不包括下标为mid,所以左区间右移即left = mid + 1;最后list中的下标为left的sum等于t时,此时得到的a、b、c、d就是最后的答案。
代码如下
暴力做法
public class 四平方和 {static PrintWriter pw = new PrintWriter(new OutputStreamWriter(System.out));static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));static StreamTokenizer st = new StreamTokenizer(br);static int n;public static void main(String[] args)throws Exception {n = nextInt();for(int a = 0; a * a <= n;a++){for(int b = 0;b * b + a * a <= n;b++){for(int c = b; c * c + b * b + a * a <= n;c++ ){int t = n - a * a - b * b - c * c;int d =(int) Math.sqrt(t);if(d * d == t){pw.println(a+" "+b+" "+c+" "+d);pw.flush();return;}}}}}public static int nextInt()throws Exception {st.nextToken();return (int)st.nval;}
二分优化
import java.io.*;
import java.util.*;public class Main {static PrintWriter pw = new PrintWriter(new OutputStreamWriter(System.out));static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));static StreamTokenizer st = new StreamTokenizer(br);static List<Sum> list = new ArrayList();static int n;public static void main(String[] args)throws Exception {n = nextInt();for(int c = 0; c * c <= n;c++){for(int d = c;c * c + d * d <= n;d++){list.add(new Sum(c * c + d * d,c,d));}}//字典序排序 lambda表达式list.sort((sum1,sum2)->{if(sum1.sum != sum2.sum) return sum1.sum - sum2.sum;if(sum1.c != sum2.c) return sum1.c - sum2.c;return sum1.d - sum2.d;});for(int a = 0; a * a <= n;a++){for(int b = a;b * b + a * a <= n;b++){int t = n - a * a -b * b;int left = 0;int right = list.size() - 1;while(left < right){int mid = (left + right)/2;if(list.get(mid).sum >= t){right = mid;}else {left = mid + 1;}}if(list.get(left).sum == t){pw.println(a+" "+b+" "+list.get(left).c+" "+list.get(left).d);pw.flush();return;}}}pw.flush();}public static int nextInt()throws Exception {st.nextToken();return (int)st.nval;}
}
class Sum{int sum;//c^2 + d^2 = sumint c;int d;public Sum(int sum, int c, int d) {this.sum = sum;this.c = c;this.d = d;}
}
总结
二分查找不仅仅是一种简单的查找方法,它在很多复杂问题中都有着非常广泛的应用。掌握二分查找的技巧,将帮助我们在面对各种挑战时,能够快速并准确地找到答案。
相关文章:
《从入门到精通:蓝桥杯编程大赛知识点全攻略》(五)-数的三次方根、机器人跳跃问题、四平方和
本博客将详细探讨如何通过二分查找算法来解决这几个经典问题。通过几个实际的例子,我们将展示如何在这些问题中灵活应用二分查找,优化计算过程,并在面对大数据量时保持高效性。 目录 前言 数的三次方根 算法思路 代码如下 机器人跳跃问题…...
Java-数据结构-二叉树习题(2)
第一题、平衡二叉树 ① 暴力求解法 📚 思路提示: 该题要求我们判断给定的二叉树是否为"平衡二叉树"。 平衡二叉树指:该树所有节点的左右子树的高度相差不超过 1。 也就是说需要我们会求二叉树的高,并且要对节点内所…...
解锁面向对象编程:Python 类与对象详解
🏠大家好,我是Yui_💬 🍑如果文章知识点有错误的地方,请指正!和大家一起学习,一起进步👀 🚀如有不懂,可以随时向我提问,我会全力讲解~ ὒ…...
国产编辑器EverEdit -重复行
1 重复行 1.1 应用场景 在代码或文本编辑过程中, 经常需要快速复制当前行,比如,给对象的多个属性进行赋值。传统的做法是:选中行-> 复制-> 插入新行-> 粘贴,该操作有4个步骤,非常繁琐。 那有没…...
记一次数据库连接 bug
整个的报错如下: com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: Could not create connection to database server. Attempted reconnect 3 times. Giving up. at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Metho…...
【Springboot相关知识】Springboot结合SpringSecurity实现身份认证以及接口鉴权
Springboot结合SpringSecurity实现身份认证以及接口鉴权 身份认证1. 添加依赖2. 配置JWT工具类3. 配置Spring Security4. 创建JWT请求过滤器5. 创建认证控制器6. 创建请求和响应对象7. 配置UserDetailsService8. 运行应用程序9. 测试总结 接口鉴权1. 启用方法级安全注解2. 定义…...
算法竞赛之差分进阶——等差数列差分 python
目录 前置知识进入正题实战演练 前置知识 给定区间 [ l, r ],让我们把数组中的[ l, r ] 区间中的每一个数加上c,即 a[ l ] c , a[ l 1 ] c , a[ l 2] c , a[ r ] c; 怎么做?很简单,差分一下即可 还不会的小伙伴点此进入学习 进入正题 …...
20250121在Ubuntu20.04.6下使用Linux_Upgrade_Tool工具给荣品的PRO-RK3566开发板刷机
sudo upgrade_tool uf update.img 20250121在Ubuntu20.04.6下使用Linux_Upgrade_Tool工具给荣品的PRO-RK3566开发板刷机 2025/1/21 11:54 百度:ubuntu RK3566 刷机 firefly rk3566 ubuntu upgrade_tool烧写详解 https://wiki.t-firefly.com/Core-3566JD4/03-upgrad…...
【Elasticsearch】Springboot编写Elasticsearch的RestAPI
RestAPI 初始化RestClient创建索引库Mapping映射 判断索引库是否存在删除索引库总结 ES官方提供了各种不同语言的客户端,用来操作ES。这些客户端的本质就是组装DSL语句,通过http请求发送给ES。 官方文档地址 由于ES目前最新版本是8.8,提供了全…...
Python数据可视化(够用版):懂基础 + 专业的图表抛给Tableau等专业绘图工具
我先说说文章标题中的“够用版”啥意思,为什么这么写。 按照我个人观点,在使用Python进行数据分析时,我们有时候肯定要结合到图表去进行分析,去直观展现数据的规律和特定,那么我们肯定要做一些简单的可视化࿰…...
1.21学习
misc buuctf-爱因斯坦 下载附件后是一个图片,用stegsolve查看一下,各个色都没有问题,然后看一下数据分析,除此之外无其他信息,再看看图片属性,不知道是啥,用随波逐流进行binwalk文件提取然后得…...
SoftGNSS软件接收机源码阅读(一)程序简介、运行调试、执行流程
原始 Markdown文档、Visio流程图、XMind思维导图见:https://github.com/LiZhengXiao99/Navigation-Learning 文章目录 一、softGNSS 简介1、概述2、相关工作3、我用 softGNSS 做的事4、文件结构5、程序执行流程图 二、程序使用1、射频前端2、参数设置3、处理开源数据…...
Spring Boot AOP实现动态数据脱敏
依赖&配置 <!-- Spring Boot AOP起步依赖 --> <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-aop</artifactId> </dependency>/*** Author: 说淑人* Date: 2025/1/18 23:03* Desc…...
Leetcode刷题-二分查找
灵神的二分视频:二分查找 红蓝染色法_哔哩哔哩_bilibili 34 class Solution:def searchRange(self, nums: List[int], target: int) -> List[int]:right len(nums) - 1left 0res [-1,-1]mid int((right left)/2)while right > left:if nums[mid] < …...
凭证Account Assignment的校验(FAGL_VALIDATE)
本文主要介绍在S4 HANA OP中凭证Account Assignment的校验配置。具体请参照如下内容: 目录 1. 定义Account Assignment校验策略(FAGL_VALIDATE) 1.1 Derivation Rule 1.2 Assignment 1.3 Initialize 1.4 Enhancement 2. 分配Account Assignment校验策略给公司…...
【20】Word:小许-质量管理-论文❗
目录 题目 NO1.2.3.4.5 NO6.7 NO8 NO9 NO10.11 题目 NO1.2.3.4.5 另存为“Word.docx”文件在考生文件夹下,F12Fn是另存为的作用布局→页面设置对话框→纸张:大小A4→页边距:上下左右不连续ctrl选择除表格外的所有内容→开始→字体对…...
二十八、Qos服务质量
Qos服务质量 一、产生原因 Resources也不是万能的,使用一段时间后,资源总量可能会超过接节点配置。 根据这个情况,我们可以设置,清除资源。给pod配置,按顺序删除 二、服务质量QoS分类 Guaranteed:最高服务质量(保证),当宿主机内存不够时,会先kill掉QoS为BestEffort…...
Flutter 改完安卓 applicationId 后App 闪退问题。
一、问题 当我们项目创建完,想 build.gradle 改 applicationId 的时候,再次执行的时候可能会出现 app 闪退问题, 控制台不显示任何错误提示 也不出现 Exit 停止运行的情况。(像下方这样, 而 app 只是在模拟器中一闪而…...
es 3期 第25节-运用Rollup减少数据存储
#### 1.Elasticsearch是数据库,不是普通的Java应用程序,传统数据库需要的硬件资源同样需要,提升性能最有效的就是升级硬件。 #### 2.Elasticsearch是文档型数据库,不是关系型数据库,不具备严格的ACID事务特性ÿ…...
小菜鸟系统学习Python第三天
1.优先级问题: 结论: 幂运算>正负号>加减乘除和整除>比较运算符>逻辑运算符 2.三元运算符 3.assert断言:抛出AssertionError异常 4.for循环 4. 5.break和continue...
保姆级教程:用PyTorch复现DALL·E核心组件之dVAE(含Gumbel-Softmax实现)
从零构建DALLE的视觉词库:PyTorch实现dVAE与Gumbel-Softmax实战 当我们需要将高分辨率图像压缩为紧凑的离散表示时,离散变分自动编码器(dVAE)提供了一种优雅的解决方案。本文将深入探讨如何用PyTorch实现DALLE中的dVAE组件&#x…...
ROFL播放器:5分钟解决英雄联盟回放播放难题的终极指南
ROFL播放器:5分钟解决英雄联盟回放播放难题的终极指南 【免费下载链接】ROFL-Player (No longer supported) One stop shop utility for viewing League of Legends replays! 项目地址: https://gitcode.com/gh_mirrors/ro/ROFL-Player 还在为英雄联盟回放文…...
C++虚函数关键指南
虚函数 virtual 关键字 使用场景 在基类中声明虚函数,允许派生类重写该函数以实现多态。 行为特点 通过基类的指针或引用调用虚函数时,调用的是对象实际类型(派生类)的函数版本。 示例代码 class Base { public:virtual void func…...
如何为Retoolkit贡献新工具:开发者完整指南与最佳实践
如何为Retoolkit贡献新工具:开发者完整指南与最佳实践 【免费下载链接】retoolkit Reverse Engineers Toolkit 项目地址: https://gitcode.com/gh_mirrors/re/retoolkit Retoolkit是一个功能强大的逆向工程工具包,为安全研究人员和逆向工程师提供…...
HunyuanVideo-Foley多模态交互案例:结合文本与视觉输入生成场景化音效
HunyuanVideo-Foley多模态交互案例:结合文本与视觉输入生成场景化音效 1. 效果亮点开场 想象一下这样的场景:你上传一张古堡图片,输入"添加一些神秘感",系统就能自动生成风声、吱呀作响的木门、隐约的钟声等复合音效。…...
EagleEye DAMO-YOLO TinyNAS实战:基于YOLOv8的高效目标检测部署
EagleEye DAMO-YOLO TinyNAS实战:基于YOLOv8的高效目标检测部署 1. 引言 目标检测在实际应用中经常遇到一个难题:既要检测准确,又要运行速度快。传统的解决方案往往需要在精度和速度之间做出妥协,要么选择复杂的模型导致推理缓慢…...
电源环路分析仪不会用?2026年硬件工程师的必备技能该补上了
电源环路分析仪不会用?2026年硬件工程师的必备技能该补上了实验室里,Buck电源刚调通,输出纹波看着也不错,但一上动态负载,输出电压就开始剧烈振荡。换了几组补偿参数,还是没找到症结所在。这时候,旁边有经验的前辈说了一句:"你测过环路稳定性吗?"说实话,…...
阿里云YUM源配置避坑指南
在CentOS 7上安装MySQL 8时,正确配置阿里云提供的YUM源是确保安装顺利、避免依赖冲突的关键。核心步骤包括清理系统旧有冲突软件包、配置稳定的软件源、处理GPG密钥验证问题。以下是一个结合官方实践和阿里云镜像优化的详细方案。 一、 核心步骤与对比 为了清晰展…...
物联网新手避坑指南:用MQTT.fx 1.7.1连接OneNET平台,从数据上报到命令下发的完整流程
物联网开发实战:MQTT.fx与OneNET平台深度对接指南 第一次打开MQTT.fx时,面对密密麻麻的配置项和晦涩的协议术语,大多数物联网初学者都会感到无从下手。这就像刚拿到驾照就让你开F1赛车——工具很强大,但学习曲线陡峭。本文将带你用…...
编程新手必看:C语言基础全解析
在当今这个数字化时代,编程已成为一项不可或缺的技能。而C语言,作为编程世界的“老牌强者”,不仅因其高效、灵活的特点被广泛应用于系统编程、嵌入式开发等领域,更是许多编程爱好者学习编程的首选语言。本文将带你走进C语言的世界…...
