二進制串題解(國際考試備用題)

                                             二進制串

    (bin.cpp)

 【問題描述】

    有N個二進制數串 B=(b , b , ..., b ),我們按以下方法建立一個矩陣M:
                         1   2  .....  N

    矩陣M的第一行是二進制數串B;
    後面的每一行都是通過把前一行循環左移而得到的。    
    b  b  ... b     b
    1  2       N-1  N

    b  b  ... b b
    2  3       N   1

   ...
    b    b  ... b    b
    N-1  N       N-3  N-2

   b  b  ... b     b
  N   1      N-2  N-1

    然後,把以行爲單位按字典順序排序得到矩陣M。
    請寫一個程序,給出矩陣M的最後一列(排序以後),求第一行(也是排序以後的)。

【輸入文件】

    第一行有一個正整數N,表示二進制串B的長度,第二行有N個用空格隔開的二進制數
    字,表示矩陣M的最後一列。

【輸出文件】

    只有一行二進制串,表示矩陣M的第一行,這N個二進制數字沒有用空格隔開。
    樣例1    
    bin1.in    
    5    
    1 0 0 1 0    

    bin1.out    
    00011

    bin2.in    
    8    
    1 1 0 1 1 0 1 0

    bin2.out    
    00111011

【數據範圍】

   對於 30%的數據,有N<=20
   對於 50%的數據,有N<=550
   對於 100%的數據,有0<N<=5000

   這道題主要是一道找規律的題目
   因它是每次左移,所以每個數字都會出現在結尾
   所以它出現了幾個1,整個二進制串就有幾個1
   其次同理每個數字也會出現在開頭
   所以按大到小排列最大的開頭肯定是1
   現在來看一下樣例,我們可以得出這樣的結論①
   0xxx1
   0xxx0
   0xxx0
   1xxx1
   1xxx0
   這裏的未知數都用xxx代替,但不表示xxx是相同的
   因爲它是從小到大排列的,所以往左移之後就是
   xxx10
   xxx00
   xxx00
   xxx11
   xxx01
   這樣看起來是變了,但是實際上它的組合數不變,組合方式不變,只是排序方式變了
   我們再將它排序就會變回結論①
   但是我們不知道這些數字前面的數字是哪一個地方的
   這裏說明一下
   結論①裏最小的二進制串左移之後再排序,它肯定就變成了結論①裏的第2串
   因爲它的後面4個是最小的,其他的例如2號串左移之前的後4個組成的二進制串肯定比1號組成的大
   所以左移之後1就變成了2號
   注意,這裏不是說1號變成2號,所以2號變成3號,3號變成4號....
   是說0開頭的1號變成了0結尾的2號
   那麼,1開頭的4號就變成了1結尾的1號
   以此類推,排序,會發現每次都是這樣子,左移之後排序都是這個順序變化
   然而要推出所有數字要n-1次,經過變化後最後一行便就是在原來的基礎上按這個方法來一遍
   即0開頭的按順序到了0結尾的去了,1開頭的按順序到了1結尾的去了

   如樣例
           順序變化
   0  1      1->2
   0  0      2->3
   0  0      3->5
   1  1      4->1
   1  0      5->4
   再按照這個變化方式輸出一次
   第一個輸出是1號對應的2號
   第二個輸出是2號對應的3號
   第三個輸出是3號對應的5號
   第四個輸出是4號對應的5號
   第五個輸出是5號對應的4號
   最後輸出便是00011

   Code:

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章