思路:当n为偶数的时候,答案为max{r(i)+r(i+1)},当n为技术的时候,第一个人取1-r1件,剩下的编号为偶数的尽量往前去,技术的尽量往后去。
下面是代码:
#include<iostream>
#include<algorithm>
#include<cstdio>
using namespace std;
const int maxn=100010;
int n,r[maxn],left1[maxn],right1[maxn];
bool can(int mid)
{
int x=r[1],y=mid-r[1];
left1[1]=x;
right1[1]=0;
for(int i=2; i<=n; i++)
{
if(i%2)
{
right1[i]=min(y-right1[i-1],r[i]);
left1[i]=r[i]-right1[i];
}
else
{
left1[i]=min(x-left1[i-1],r[i]);
right1[i]=r[i]-left1[i];
}
}
return left1[n]==0;
}
int main()
{
#ifndef ONLINE_JUDGE
freopen("in.txt","r",stdin);
#endif
while(cin>>n,n)
{
int max1=0;
for(int i=1; i<=n; i++)
cin>>r[i];
if(n==1)
{
cout<<r[1]<<endl;
continue;
}
r[n+1]=r[1];
int l=0,R=0,mid;
for(int i=1; i<=n; i++)
if(l<r[i]+r[i+1]) l=r[i]+r[i+1];
if(n%2)
{
for(int i=1; i<=n; i++)
R=max(R,r[i]*3);
while(l<R)
{
mid=(l+R)/2;
if(can(mid)) R=mid;
else l=mid+1;
}
}
cout<<l<<endl;
}
return 0;
}