NOIP模擬 提高組 外星密碼

2021-08-19 14:02:56 字數 3335 閱讀 9134

【問題描述】

小 w 潛入了外星人的基地刺探情報,遇到乙個二級密碼系統。一級密碼是乙個長度為

n 的 0-1 序列 b, 記為(b1 b2 ⋯ bn)。 將一級密碼的第一位放到最後,得到乙個新的序

列(b2 b3 ⋯ b1), 繼續做同樣的操作得到(b3 b4 ⋯ b2),如此反覆,總共可以得到

n 個序列,將這些序列按字典序排序後,字典序最小的即為二級密碼,輸入這個二級密

碼,就可以得到情報。

外星人將領將排序過後的 n 個字串按照字典序從小到大的順序逐行寫成了乙個 n 階

矩陣,而且小 w 恰好看到了這個矩陣,不難發現,這個矩陣的第一行就是二級密碼,所以

如果小 w 記住這個矩陣的第一行,就可以直接獲得情報。但是小 w 在出發前聽上司布置

任務時走神將「記住第一行」聽成了「記住最後一列」。所以小 w 現在只記得最後一列是

什麼,小 w 趕緊聯絡遠在地球的你,希望你能幫他由矩陣的最後一列得到矩陣的第一行。

【輸入格式】

共兩行,第一行乙個整數 n,第二行 n 個值為 0 或 1 的整數,表示矩陣的最後一列。

【輸出格式】

輸出檔案共一行,為矩陣的第一行。

【樣例】

5 1 1 0 0 0

0 0 1 0 1

【資料規模與約定】

對於 20%的測試資料n ≤ 20

對於 50%的測試資料 n≤ 1000

對於 100%的測試資料n ≤ 10000

【樣例解釋】

一級密碼為(0 1 0 0 1),因此得到 5 個序列為:

0 1 0 0 1

1 0 0 1 0

0 0 1 0 1

0 1 0 1 0

1 0 1 0 0

經過排序過後的矩陣為:

0 0 1 0 1

0 1 0 0 1

0 1 0 1 0

1 0 0 1 0

1 0 1 0 0

分析:看到題,首先想到的一定是搜尋,但是一看資料範圍,n<=10000那就一定不是搜尋了。所以還是從模擬入手找規律。

有兩個重要的規律,此處詳解:

設一級密碼為 b1,b2,b3.b4,b5,b6

則所有一級密碼為:

b1 b2 b3 b4 b5

b2 b3 b4 b5 b1

b3 b4 b5 b1 b2

b4 b5 b1 b2 b3

b5 b1 b2 b3 b4

可以將樣例帶入b1,b2,b3,b4,b5

排序可得矩陣:

b3 b4 b5 b1 b2

b1 b2 b3 b4 b5

b4 b5 b1 b2 b3

b2 b3 b4 b5 b1

b5 b1 b2 b3 b4

現在就得到了這樣乙個矩陣,因為題設含義為字典序從小到大,所以不難發現第乙個規律:

b3<=b4<=b5<=b1<=b2

它的意思就是通過給定最後一列得出第一列有幾個0,則第一列前面全為0,後面全為1。

通過這種方法,樣例不難得出第一列為:

0

0 0 1 1

然後,我們畫出第一列和最後一列:

0      1

0      1

0      0

1      0

1      0

觀察發現第一列的第乙個0對應最後一列第乙個0,第一列第二個0對應最後一列第二個0……1的規律也是如此。

這裡用另一組資料給出證明,若輸入

6

1 1 1 0 1 0

則可以得出第一列和最後一列:

0      1

0      1

1      1

1      0

1      1

1      0

按照如上結論第一列第一行的0對應最後一列第四行的0,第一列第二行的0對應最後一列第六行0

為什麼是第一行的0對應第四行而不是第六行的0呢?

因為每行已按照字典序從小到大排序,說明第一行中間四個數字一定小於第二行中間四個數字,第四行和第六行也是如此。所以小的對應小的,而不是小的對應大的。

找到這兩個規律,接下來就好辦了。

還是以上面樣例。因為求的陣列相當於第一行,所以甚至不需要開二維陣列,現在設第一行6個數:

0 a b c d 1

則按照一次密碼變換之後為:

a b c d 1 0

因為上面提到此處末尾的0對應第乙個0,所以這6個數的順序和第四行順序一致

故:a=1

因為此時為:

1 b c d 1 0

且此時為第四行的1,因為第四行的1對應最後一列第二行的1

所以:

b c d 1 0 1

順序與第二行一致,故b=0

以次類推。

至此,此題就可以解出來了。

**:

#include

using

namespace

std;

int n;

int hang[10001],lie_last[10001],lie_first[10001],a1[10001]= ,a0[10001]= ;

int ref[10001];

int num=0;

int main()

for(int i=1; i<=n; i++)

int re_0=1,re_1=1;

for(int i=1; i<=n; i++)

for(int i=1; i<=n; i++)

hang[1]=lie_first[1];

hang[n]=lie_last[1];

cout

<1]<<" ";

int k=1;

for(int i=2;icout

<" ";

k=ref[k];

}cout

0;}

NOIP提高組 20151029模擬

其實這套題目並不算太難,但是還是發揮不了100 水平。第一題直接線性篩法,求出質數,然後就可以判斷乙個數是否為質數了。這道題還可以用miller rabin去求,後者的速度較快,如果資料再大些,就要使用後者了。第二題,比賽時發現了,當n 7時,答案會每四個一迴圈,但是就沒有繼續往下想,其實想下去會想...

NOIP提高組模擬 Value

相信大家一看到這道題就想起最經典的揹包問題,於是毫無疑問就往dp方向想。於是我們設出狀態轉移方程,設f i j k 為我要拿i個物品,已經選了j個,現在第j個我選了k的最大價值,那麼f i j k max,其中l為第j 1次選擇的物品。但很快我們發現,你這樣做是不行的,因為我們還要解決順序問題,選擇...

NOIP提高組模擬 幻象

phantom是一位愛思考的哲 學家。最近phantom得到了森 妖精的真傳。在他練功的時候,每秒他的思緒中都有一定的概率浮現出奇 異的幻象,持續x秒的幻象將產生x 2 的幻象值。phantom練功發自真心,他想知道,在n秒內他期望產生的幻象值是多少。因為持續x秒的幻象將產生x2 的幻象值,所以設乙...