[NOIP2010冲刺十二] 圆圈舞蹈

【题目描述】

 

    熊大妈的奶牛在时针的带领下,围成了一个圆圈跳舞。由于没有严格的教育,奶牛们之间的间隔不一致。

      奶牛想知道两只最远的奶牛到底隔了多远。奶牛AB的距离为A顺时针走和逆时针走,到达B的较短路程。告诉你相邻两个奶牛间的距离,请你告诉奶牛两只最远的奶牛到底隔了多远。

 

【输入格式】

 

   第一行一个整数N,表示有N只奶牛。(2N100000)

     接下来2N+1行,第I行有一个数,表示第I-1头奶牛顺时针到第I头奶牛的距离。(1≤距离≤maxlongint,距离和≤maxlongint)

   N+l行的数表示第N头奶牛顺时针到第1头奶牛的距离。

 

【输出格式】

一行,表示最大距离。

【样例输入】

5 
1 
2 
3 
4 
5

【样例输出】

7



单调队列,对拍啊对拍!
 1 #include<iostream>
 2 #include<fstream>
 3 using namespace std;
 4 ifstream fin("circlea.in");
 5 ofstream fout("circlea.out");
 6 
 7 int n,a[200005],tot=0;
 8 
 9 int min(int a,int b){
10     if(a<b) return a;return b;
11     }
12 
13 int main()
14 {
15     fin>>n;
16     
17     for(int i=1;i<=n;++i)
18     fin>>a[i],tot+=a[i];
19     
20     for(int i=1;i<=n;++i)
21     a[n+i]=a[i];
22     
23     int l=1,r=1,sum=0,ans=0;
24     
25     while(r<=2*n)
26     {
27       sum+=a[r];
28       while(tot-sum<sum) {sum-=a[l];l++;}
29       
30       if(min(sum,tot-sum)>ans) ans=min(sum,tot-sum);
31       r++;
32             }
33     
34     fout<<ans<<endl;
35    // system("pause");
36     return 0;
37     
38     } 
posted on 2012-10-26 01:11  怡红公子  阅读(277)  评论(0编辑  收藏  举报