犯了了几点错误:
1. 在check函数里修改了mid。
2. check函数里的循环次数错了。
3. 15行需要在分出来一个e>=maxx的分支,解决了两个问题:
1)能减少循环次数,e>=maxx的时候后续无需再跳,因为后续的一定都能跳过,此时返回true。
2)能保证e不爆int。
#include<iostream>
using namespace std;
const int N=1e5+10;
int a[N],n;
int maxx=-1;
bool check(int mid)
{
int js=0;
int e=mid;
for(int i=1;i<=n;i++)
{
e=2*e-a[i];
if(e<0)
return false;
if(e>=maxx)
return true;
}
return true;
}
int main()
{
// freopen("xxx.in","r",stdin);
// freopen("yyy.out","w",stdout);
cin >> n;
for(int i=1;i<=n;i++)
{
cin >> a[i];
if(a[i]>maxx)
maxx=a[i];
}
int l=1,r=maxx;
while(l<r)
{
int mid=(l+r)>>1;
if(check(mid))
r=mid;
else
l=mid+1;
}
cout << l;
// fclose(stdin);
// fclose(stdout);
return 0;
}