二分
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
const int N =100010;
int n;
int h[N];
bool check(int e)
{
for(int i=1; i<=n ;i++)
{
e=e*2 -h[i];
if(e>=1e5) return true;
if(e<0) return false;
}
return true;
}
int main()
{
scanf("%d",&n);
for(int i =1; i<=n;i++) scanf("%d",&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",r);
return 0;
}
贪心(参考)
#include<bits/stdc++.h>
using namespace std;
const int N=100010;
int num[N];
int n;
int main(){
cin>>n;
for(int i=0;i<n;i++)cin>>num[i]; //从后往前推
int res = 0;
for(int i = n - 1; i >= 0; i--){
if((num[i] + res) % 2 == 0)
res = (num[i] + res) / 2;
else
res = (num[i] + res) / 2 + 1;
}
cout<<res<<endl;
}