二分+贪心+LA3177

来源:互联网 发布:网络词不鸽是什么意思? 编辑:程序博客网 时间:2024/05/16 09:12

思路:当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;}


0 0