最小为0,最大为H[]数组最大值,然后进行二分
!!!! 注意在get数组,如果累计能量大于最大值,则返回1,否则能量会累加到溢出,导致结果出错
#include<iostream>
using namespace std;
int h[100005];
int n;
int maxx=0;
bool get(int xx)
{
long long ene=xx;
for(int i=1;i<=n;i++)
{
ene=(ene+ene-h[i]);
// cout<<ene<<" "<<i<<endl;
if(ene<0)
{
// cout<<endl<<"***"<<i<<"****";
return 0;
}
if(ene>maxx) //!!!!!!!!
return 1;
}
return 1;
}
int main()
{
cin>>n;
for(int i=1;i<=n;i++)
{
scanf("%d",&h[i]);
maxx=max(maxx,h[i]);
}
int l=0;
int r=maxx+1;
int mid;
// cout<<get(23);
while(l<r)
{
mid=(l+r)/2;
if(get(mid))
{
r=mid;
}else {
l=mid+1;
}
}
cout<<l;
return 0;
}