机器人跳跃问题 (二分)
题意描述
机器人正在玩一个古老的基于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)≤105,
输入样例1: 5 3 4 3 2 4 输出样例1: 4 输入样例2: 3 4 4 4 输出样例2: 4 输入样例3: 3 1 6 4 输出样例3: 3
思路
第一次做二分类型的题,完全没有思路,找不到满足的性质。 先来向大家分享一下整数二分的步骤:
整数二分的步骤: 1.找一个区间[L,R],使得答案一定在该区间中 2.找一个判断条件,使得该p判断条件具有二段性,并且答案一定是该二段性的分界点 3.分析终点M在该判断条件下是否成立,如果成立,考虑答案在哪个区间;如果不成立,考虑答案在哪个区间。 4.如果更新方式写的是R=mid,则不用做任何处理;如果更新方式写的是L=mid,则需要在计算mid时加1
那么我们来看这道题,首先找到一个区间。很明显,答案一定在[0,1e5]这个区间中。根据题意,如果h[k+1]>e,那么能量会损耗2e-h[k+1],如果h[k+1]<e,那么能量会增加2e-h[k+1],这时,题目所描述的两种情况就变成了一种。想要成功完成游戏,能量值在游戏的过程中就不能为负数,这就找到了一个性质。我们要找的就是满足这个性质的最小值。再来考虑一下,给定的能量区间中肯定存在一个最大的值,如果在某个时刻,能量值大于等于这个最大的能量,那么在之后的过程中就能量值肯定不可能为负数。接下来来考虑答案应该在哪个区间,如果满足了check程序,那么我们应该将R更新为mid。
AC代码
#include<iostream>
using namespace std;
const int N=1e5+10;
int h[N];
int n;
//判断是否满足该性质
bool check(int mid){
for(int i=0;i<n;i++){
mid=mid*2-h[i];
if(mid>=1e5) return true;//不妨设最大值为1e5
if(mid<0) return false;
}
return true;
}
int main(){
cin>>n;
for(int i=0;i<n;i++) cin>>h[i];
int l=0,r=1e5;
while(l<r){
int mid=l+r>>1;
if(check(mid)) r=mid;//更新区间
else l=mid+1;
}
cout<<l<<endl;
return 0;
}
- 深度解析 TypeConverter & TypeConverterAttribute (一)
- 从MapX到MapXtreme2004[7]-对Table、Feature等的理解
- 互联网赋能传统装企 “科技撬动力巨大”
- Python接口自动化-8-测试报告
- http应用优化和加速说明-负载均衡
- linux负载均衡总结性说明(四层负载/七层负载)
- 从MapX到MapXtreme2004[6]-标点心得
- silverlight3中的"伪"3D
- 暴利驱动的疯狂游戏“外挂”:非法获利可达数百万;X-Agent 后门大升级,俄罗斯 APT28 间谍活动更为隐蔽
- Nginx+keepalived双机热备(主从模式)
- 即使不做程序员,也要学会像程序员一样去思考
- 这5项高科技 正在颠覆未来医疗
- xml的解析
- “微信身份证”来了!下月起全国推广!
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Flutter基础widgets教程-RaisedButton篇
- 记一次 excel vba 参考手册爬虫实战,不必要的一次爬虫。
- xray子域名扫描结果导出
- AWS的湖仓一体使用哪种数据湖格式进行衔接?
- python 行政区域地址标准化:业务经理填报的地址乱起八糟,高德接口有点厉害!
- python 行政区域地址标准化:业务经理填报的地址乱起八糟,高德接口有点厉害! -- 后续,使用分词思路完成解析
- pandas 一维台账数据与二维表格数据的转换
- Flutter基础widgets教程-Row篇
- padans 关于数据处理的杂谈 -- 时序数
- python pandas DataFrame 关于重复索引取值的一些坑
- selenium webdriver 如何添加cookie
- Flutter基础widgets教程-Scaffold篇
- python selenium 微信公众号历史文章随手一点就返回首页?郁闷之下只好将他们都下载下来。
- Flutter基础widgets教程-SimpleDialog篇
- python selenium 关于将网页打包为静态网页(mhtml)下载。