題目解析:推理+二分。
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define MAX 100010
int a[MAX],n,left[MAX],right[MAX];
int max(int x,int y)
{
return x>y ?x:y;
}
int min(int x,int y)
{
return x<y?x:y;
}
int check(int p)
{
int i,j;
int x=a[1],y=p-a[1];
left[1]=x;
right[1]=0;
for (i=2;i<=n;i++)
{
if (i%2==0)
{
left[i]=min(x-left[i-1],a[i]);
right[i]=a[i]-left[i];
}
else
{
right[i]=min(y-right[i-1],a[i]);
left[i]=a[i]-right[i];
}
}
return left[n]==0;
}
int main()
{
while (scanf("%d",&n)!=EOF)
{
if (n==0)
break;
int i,j,L=0,R=0;
for (i=1;i<=n;i++)
{
scanf("%d",&a[i]);
}
if (n==1)
{
printf("%d\n",a[n]);
continue;
}
a[0]=a[n];
for (i=1;i<=n;i++)
{
L=max(L,a[i]+a[i-1]);
}
if (n%2==1)
{
for (i=1;i<=n;i++)
R=max(R,a[i]*3);
while (L<R)
{
int M=L+(R-L)/2;
if (check(M))
R=M;
else
L=M+1;
}
}
//for (i=1;i<=n;i++)
//printf("%d ",a[i]);
printf("%d\n",L);
}
return 0;
}