AcWing 730. 机器人跳跃问题
原题链接
中等
作者:
牛奶小柒Luke
,
2021-03-21 22:55:00
,
所有人可见
,
阅读 307
确定区间[l,r]为e的取值范围
判断条件:e的值随h的增高而减少,具有单调性,且具有二段性;并且答案一定是该二段性的分界点
分析终点在该判断条件下是否成立,h>e,e = 2e - h;h<e,e = 2e - h;当check(mid)成立时
答案在左区间上,更新区间
因为更新区间写的是r = mid,则不用做任何处理
#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
using namespace std;
const int N = 1e5 + 10;
int n;
int h[N];
bool check(int e){
for(int i = 0;i < n;++i){
e = 2 * e - h[i];
if(e >= 1e5) return true;
if(e < 0) return false;
}
return true;
}
int main(){
scanf("%d",&n);
for(int i = 0;i < n;++i) scanf("%d",&h[i]);
int l = 0,r = N;
while(l < r){
int mid = l + r >> 1;
if(check(mid)) r = mid;
else l = mid + 1;
}
cout << l << endl;
return 0;
}