解题思路:
代码: (看y总的)
有n + 1 座建筑,机器人从第一座建筑开始,能量为 E ,然后跳到下一座建筑,如果建筑的高度 hi 小于能量值E ,那么能量值将会增加 ( E - hi ),否则降低 ( hi - E )。因此综合式子为(2 * E - hi )。对于每一个选值, 可以进行遍历查询是否符合要求,如果遍历过程中出现 E < 0,
那么一定不符合要求,直接返回 false , 如果大于最大高度,返回 true ,如果正常执行完毕,则返回true。
对于选值,可以利用二分操作进行选取,基本套用二分模板进行值的选取。
代码: (看y总的)
#include <cmath>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
const int N = 100010;
int n , h[N] , mx;
bool check(int mid){ // 判断是否成立
int res = mid;
for (int i = 0 ; i < n; i++){
res = 2 * res - h[i];
if (res < 0) return false;
if (res >= mx) return true;
}
return true;
}
int main(){
scanf("%d",&n);
for (int i = 0 ; i < n; i++){
scanf("%d",&h[i]);
mx = max(mx,h[i]);
}
int l = 1;
int r = mx;
while(l < r){ // 二分模板
int mid = l + r >> 1;
if (check(mid)) r = mid ;
else l = mid + 1;
}
printf("%d\n",l);
return 0;
}