1335 - Beijing Guards

題目鏈接:http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&category=456&problem=4081&mosmsg=Submission+received+with+ID+12196678

題目解析:推理+二分。

#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;    
}




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章