#include <cstdio>
#include <algorithm>
using namespace std;
#define FOR(x,y,z) for(int (x)=(y);(x)<(z);++(x))
const int maxn = 100000 + 10;
int n,a[maxn],mleft[maxn],mright[maxn];
//left[i] 表示从左边开始拿了i个礼物
//通过a[0]来区分左右
int ok(int p){
int x = a[0],y = p - a[0];
mleft[0] = a[0],mright[0] = 0;
FOR(i,1,n){
if(i&1){
mleft[i] = min(x - mleft[i - 1],a[i]);
mright[i] = a[i] - mleft[i];
}else {
//看右边能拿的有多少个
mright[i] = min(y - mright[i - 1],a[i]);
//不够的从左边拿
mleft[i] = a[i] - mright[i];
}
}
return mleft[n - 1] == 0;
}
int main(){
while(~scanf("%d",&n) && n){
FOR(i,0,n) scanf("%d",&a[i]);
if(n == 1){
printf("%d\n",a[0]);
continue;
}
int l = 0,r = 0,mid;
a[n] = a[0];
FOR(i,0,n) l = max(l , a[i] + a[i + 1]);
if(n & 1){
FOR(i,0,n) r = max(r,a[i] * 3);
while(l < r){
mid = l + (r - l)/2;
if(ok(mid)) r = mid;
else l = mid + 1;
}
}
printf("%d\n",l);
}
return 0;
}
[2016-03-19][UVALive][3177][Beijing Guards]
原文:http://www.cnblogs.com/qhy285571052/p/0971a99752cd7e96580e57039f2202b7.html