AcWing 730. 机器人跳跃问题
原题链接
中等
作者:
林小鹿
,
2020-08-17 17:38:52
,
所有人可见
,
阅读 413
//思路:二分,答案所在区间为1-1e5,具有单调性,且当x>=E(min),从E(min)往后的区间值都可以完成
//整个游戏,因此可以将整个区间一分为二,我们二分求边界E(min)
//我们发现这样一个性质:当能量值大于游戏中建筑的最高值时,跳过最高建筑时能量值不变,在跳高度低于最
//高建筑时,能量值一直在增加,因此可以完成整个游戏
//H(k+1)>E,E=E-(H(k+1)-E)=2*E-H(k+1)
//H(k+1)<=E,E=E+(E-H(k+1))=2*E-H(k+1) 综上在跳跃过程中,计算能量公式为:E=2*E-H(k+1)
#include<iostream>
#include<algorithm>
using namespace std;
const int N=1e5+10;
int h[N],maxn,n;
bool check(int E) //我们带入一个初始能量值,检查它是否满足条件
{
for(int i=1;i<=n;i++)
{
E=E*2-h[i];
if(E<0) return false;
if(E>=maxn) return true;
}
return true;
}
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
scanf("%d",&h[i]);
maxn=max(maxn,h[i]);
}
int l=0,r=1e5;
while(l<r)
{
int mid=l+r>>1;
if(check(mid)) r=mid;
else l=mid+1;
}
printf("%d\n",l);
return 0;
}