1. 程式人生 > 實用技巧 >2011百度之星初賽B圓環

2011百度之星初賽B圓環

這是百度之星2011初賽B中的第一道題,題目也很水,只要找到解題思路就OK了。。

題目:

時間限制:1000ms 描述 一個圓環上有n個位置,這n個位置按順時針依次標號為1, 2, …, n。初始時圓環的每個位置上都有一個1至n之間的整數,且每個整數只出現一次。 任何時刻,你可以將圓環上的數全部逆時針旋轉一個位置,即第i個位置上的數變為原來第i + 1個位置上的數,第n個位置上的數變為原來第1個位置上的數。也可以將圓環上的數全部順時針旋轉一個位置,即第i個位置上的數變為原來第i – 1個位置上的數,第1個位置上的數變為原來第n個位置上的數。另有一個裝置,可以交換圓環上第a個位置和第b個位置上的數。
下圖給出了三種操作的示例,圓環上有6個位置,初始數字分別為1, 2, 4, 3, 5, 6,能交換第2個和第3個位置上的數。經過一次逆時針旋轉後變為2, 4, 3, 5, 6, 1,交換後變為2, 3, 4, 5, 6, 1,再經過一次順時針旋轉後變為1, 2, 3, 4, 5, 6。

請問通過旋轉和交換,能否使得第i個位置上的數正好是i 輸入 輸入包含多組資料。 每組資料的第一行包含一個整數n,表示圓環上的數字個數。 第二行包含兩個整數a, b(1 ≤ a < bn),表示可以交換圓環上第a個位置和第b個位置上的數。 接下來n行描述圓環上每個位置的初始值,其中第
i行包含一個整數ai,表示初始時刻第i個位置上的數。 最後一組資料之後的一行為一個0,表示輸入結束。 輸出 對於每個測試用例,輸出一行,如果能滿足要求,這行中應只包含一個單詞Yes,如果不能滿足要求,這行中應只包含一個單詞No 樣例輸入 6 2 3 1 2 4 3 5 6 4 1 3 1 2 4 3 0 樣例輸出 Yes No 提示 對於100%的資料,1 ≤ n ≤ 1,000

解法思路:

首先我們定義“連通”的概念:如果在圓環中的位置可以互換,則我們認為這兩個數是連通的。。。我們可以找到一個連通的一串數,則這串數中任意兩個數是可以互換的。(why?自己證明把,很簡單!)首先我們對每個數,找到他所屬於的連通分支,然後從小到大進行排序。。。最後如果這些數能夠組成連續的自然數,我們就認為這個圓環通過旋轉和交換,能夠使i的位置上的數是i。。

如圖:

程式碼實現起來很容易,其實我也沒寫,希望有時間的同學可以寫下。。。

轉載於:https://blog.51cto.com/canghailongteng/877986