机器人跳跃问题 (二分)
题意描述
机器人正在玩一个古老的基于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;
}
- 从老漏洞到新漏洞---iMessage 0day(CVE-2016-1843) 挖掘实录
- Wordpress <= 4.6.1 使用语言文件任意代码执行 漏洞分析
- 如何使用hadoop命令向CDH集群提交MapReduce作业
- Wordpress <= 4.6.1 使用主题文件触发存储型XSS 漏洞分析
- 如何跨平台在本地开发环境提交MapReduce作业到CDH集群
- 区块链行业的机会
- KEGG数据库的rest API(附带R语言小技巧)
- 如何使用Java代码访问HDFS.docx
- Django CSRF Bypass (CVE-2016-7401) 漏洞分析
- 如何使用Cloudera Manager禁用YARN的HA
- Web Worker 中的 importScripts 和 baseHref 同源策略绕过问题
- 如何使用Java代码访问CDH的Solr服务
- Safari UXSS漏洞分析(CVE-2016-4758)
- Sqoop抽取Hive Parquet表数据到MySQL异常分析
- 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 数组属性和方法
- 多个Laravel项目如何共用migrations详解
- PHP实现文字写入图片功能
- php中file_get_contents()函数用法实例
- PHP通过GD库实现验证码功能示例
- Thinkphp 5.0实现微信企业付款到零钱
- 使用npy转image图像并保存的实例
- php实现有序数组旋转后寻找最小值方法
- 基于python实现音乐播放器代码实例
- PHP实现微信对账单处理
- Win10下配置tensorflow-gpu的详细教程(无VS2015/2017)
- PHP Include文件实例讲解
- ThinkPHP5.1框架页面跳转及修改跳转页面模版示例
- Python Switch Case三种实现方法代码实例
- PHP正则表达式笔记与实例详解
- php实现微信分享朋友链接功能