思路:我们从数据范围和题意可以分析出是一道二分查找的题目,那么确定 left 和 right 是这解决道题的关键,我们简单推到可得,不论当前 E 是否大于下一个建筑的 H,跳跃到下一个建筑的能量变化是相等的 例如当前在第 i 个建筑能量为 E 那么在第 i+1 个建筑的能量为 2*E-H(i+1)
left:假设开始能量为E 一共有三个建筑 那么满足等式 [( 2E-H(0) ) - H(1)] -H(2) > 0
right: 如果初始能量大于 建筑H 最大值 就一定能满足题意的跳跃到终点 right=max(H)
剪枝:若在任何一步跳跃过程中,所处的能量值>max(H) 即可判断满足题意跳到终点
#include<iostream>
#include<cmath>
using namespace std;
const int N=1e5+10;
long long int st[N];
long long int n,flag;
bool check(long long int mid)
{
for(int i=0;i<n;i++)
{
mid=mid*2-st[i];
if(mid<0)
{
return false;
}
if(mid>flag)
{
return true;
}
}
return true;
}
int main()
{
long long int sum=0;
long long int left=0,right=0;
cin>>n;
for(int i=0;i<n;i++)
{
cin>>st[i];
sum=2*sum+st[i];
right=max(right,st[i]);
}
flag=right;
for(int i=0;i<n;i++)
{
sum/=2;
}
left=sum;
long long int mid;
while(left<right)
{
mid=(left+right)/2;
if(check(mid))
{
right=mid;
}
else
{
left=mid+1;
}
}
cout<<left;
return 0;
}