原题
刚开始还以为是个前缀和,结果是个二分,涨知识涨知识
#include<bits/stdc++.h>
using namespace std;
const int N = 1e5 + 10;
int h[N];
int n;
bool check(int mid){
for(int i = 1; i <= n; i ++ ){
mid = mid * 2 - h[i];
if(mid < 0) return false;//如果中途出现能量值为0,则这个初始能量值不符合
if(mid >= 1e5) return true;//如果能量值超出1e5则肯定不是最小值,返回true让右边界左移
}
return true;//如果遍历能完所有h[i],则能量值符合条件
}
int main()
{
cin>>n;
for(int i = 1; i <= n; i ++ ){
cin>>h[i];
}
int l = 0, r = 1e5;//能量值的最小值和最大值
while(r > l){
int mid = l + r >> 1;
if(check(mid)) r = mid;//如果这个能量值符合条件,就可以减小能量值试试能不能得到更小值
else l = mid + 1;//如果该能量值不满足,则让左边界右移,增大初始能量值
}
cout<<r<<endl;
return 0;
}