[NOIP2010冲刺十二] 圆圈舞蹈
【题目描述】
熊大妈的奶牛在时针的带领下,围成了一个圆圈跳舞。由于没有严格的教育,奶牛们之间的间隔不一致。
奶牛想知道两只最远的奶牛到底隔了多远。奶牛A到B的距离为A顺时针走和逆时针走,到达B的较短路程。告诉你相邻两个奶牛间的距离,请你告诉奶牛两只最远的奶牛到底隔了多远。
【输入格式】
第一行一个整数N,表示有N只奶牛。(2≤N≤100000)
接下来2~N+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 }