切換
舊版
前往
大廳
主題

ZeroJudge - d547: 4. 秘密(secrets) 解題心得

Not In My Back Yard | 2020-10-16 00:30:24 | 巴幣 0 | 人氣 196

題目連結:


題目大意:
輸入第一列給定兩正整數 N 、 M ,代表有 N 扇門,密碼的長度為 M 。第二列給定 M 個整數(只會是 0 或是 1),代表密碼的內容。

接下來 N 列,每列給定 N + 1 個整數,代表門上的數字序列。現在要判斷哪一扇門符合密碼。

判斷方式為:
從門上的數列之尾端兩個元素開始,兩者比大小。排後面的(右邊)倘若比前面(左邊)的大,則為「1」;反之為「0」。

接著將後者減去前者取絕對值,該值再與下一個數字比。一樣後面(剛剛計算的差之絕對值)大於前面為「1」,反之為「0」。

然後將剛剛求差的前者之值(不是絕對值本身喔)減去這個新來的數字,得到一個新的差。以此類推值到最前面的數字。

如果有一扇門經過以上過程產生的由 0 、 1 組成之數列為密碼的倒序(也就是數列倒著看的話與密碼一致),則輸出該扇門的原數字數列(不是產生出來的 01 數列,且保證有且僅有一扇門符合密碼)。



範例輸入:
2 2
0 0
3 5 4
12 45 47


範例輸出:
3 5 4


解題思維:
就是單純地模擬比較大小以及求差值的過程。

假設密碼序列為 P1 、 P2 、 …… 、 PM 、現在的門之序列為 D1 、 D2 、 …… 、 DM 、 DM+1

則題目的判斷過程即為如下:

首先令一變數 C,初始值為 DM+1,作為兩兩相比時的「後者」。然後先比較 C 與 DM,如果 C > DM ,則產生的序列之第一個數字為「1」;反之,為「1」。

接著將 C 值變更為 DM+1 - DM。然後比較 C 和 DM-1,則可以得出生成序列第二個數字為「1」還是「0」。

然後再更新 C 值為 DM - DM-1 ,去比較 C 以及 DM-2 ……以此類推。

由上可以生出一個長度為 M 的新序列,然後將此序列從尾端開始往頭端、密碼序列從頭到尾一一比較。如果完全符合,則代表此門的數列是所求,輸出即可。




此次分享到此為止,如有任何更加簡潔的想法或是有說明不清楚之地方,也煩請各位大大撥冗討論。

創作回應

相關創作

更多創作