【問題描述】
熊大媽的奶牛在時針的帶領下,圍成了乙個圓圈跳舞。由於沒有嚴格的教育,奶牛們之間的間隔不一致。
奶牛想知道兩隻最遠的奶牛到底隔了多遠。奶牛a到b的距離為a順時針走和逆時針走,到達b的較短路程。告訴你相鄰兩個奶牛間的距離,請你告訴奶牛兩隻最遠的奶牛
到底隔了多遠。
【輸入】
第一行乙個整數n,表示有n只奶牛。(2≤n≤100000)
接下來2~n+1行,第i行有乙個數,表示第i-1頭奶牛順時針到第i頭奶牛的距離。(1≤距離≤maxlongint,距離和≤maxlongint)
第n+l行的數表示第n頭奶牛順時針到第1頭奶牛的距離。
【輸出】
一行,表示最大距離。
【樣例】
circle.in
4circle.out
【樣例解析】
circle.out所有奶牛i到j之間的距離和到達方式(順為順時針,逆為逆時針)如下:
i\j123
451o
1 (順)
3(順)
6(順)
5(逆)
21(逆)
o2(順)
5(順)
6(逆)
33(逆)
2(逆)
03(順)
7(順)
46(逆)
5(逆)
3(逆)
04(順)
55(順)
6(順)
7(逆)
4(逆)
0所以,最遠的兩頭奶牛為3到5,距離是7。
話不多說,**裡有足夠多的註解,可結合圖例一起看。好了,上**!
#include#include#include#includeusing namespace std;
/*
1.列舉每乙個點 直到找到乙個大於圓的一半周長的點
2.總長度減去剛找到的長度 進行比較大小(然後選小的)
3.求出每頭奶牛與它相離最遠奶牛的距離:求兩頭 1頭順時針最大的1頭逆時針最大的
*/ int n;
int a[100010];
int c=0;//記錄圓的周長
int ans=0;//記錄答案
void init()}
void work()
} int q=min(sum,abs(c-sum));//記錄的是 該點應該選擇的路(題上說走順時逆時中最短的)
int q1=min(sum-a[k-1],abs(c-(sum-a[k-1])));//該點記錄的是點k的距離(同上)
ans=max(q1,q);
//ans=max(ans,q1);
//---------------------------------以上幾步的實質為二分
for(int i=1;i<=n;i++)//從第二頭奶牛開始列舉 因為我們可以發現如果奶牛a的最大距離是到d 那麼b的最大距離一定是從e開始列舉
ans=max(ans,min(sum,abs(c-sum)));
ans=max(ans,min(sum-a[k-1],abs(c-(sum-a[k-1]))));
}printf("%d",ans);
}int main()
1 圓圈舞蹈(circle )
1 圓圈舞蹈 circle.問題描述 熊大媽的奶牛圍成了乙個圈在跳圓舞曲。由於沒有嚴格的教育,奶牛們之間的間隔距離不一致,現在告訴你相鄰兩個奶牛間的距離,熊大媽想知道兩隻最遠的奶牛到底隔了多遠。奶牛a到b的距離為a順時針走或逆時針走到達b的較短距離。輸入格式 第一行乙個整數n,表示有n只奶牛。接下來...
2768 圓圈遊戲(circle)
在無聊的時候,小k和小h會在紙上玩這樣乙個遊戲。我們可以將紙看做乙個平面直角座標系。小h會先在上面畫出 n nn 個圓,並把每個圓的圓心以及半徑都告訴小k。小h畫的 n nn 個圓中,任意兩個圓不會出現相交或相切的情況。小k需要做的就是從這 n nn 個圓中選出若干個圓,使得選出的任意乙個圓都不被另...
2768 圓圈遊戲(circle)
題目描述 在無聊的時候,小k和小h會在紙上玩這樣乙個遊戲。我們可以將紙看做乙個平面直角座標系。小h會先在上面畫出 n 個圓,並把每個圓的圓心以及半徑都告訴小k。小h畫的 n 個圓中,任意兩個圓不會出現相交或相切的情況。小k需要做的就是從這 n 個圓中選出若干個圓,使得選出的任意乙個圓都不被另乙個選出...