#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