奶牛專題1 圓圈舞蹈

2021-07-05 22:06:01 字數 1708 閱讀 3863

【問題描述】

熊大媽的奶牛在時針的帶領下,圍成了乙個圓圈跳舞。由於沒有嚴格的教育,奶牛們之間的間隔不一致。

奶牛想知道兩隻最遠的奶牛到底隔了多遠。奶牛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 個圓中選出若干個圓,使得選出的任意乙個圓都不被另乙個選出...