b256: 如果你在牌桌上看到程式設計師
標籤 :
通過比率 : 1人/2人 ( 50% ) [非即時]
評分方式:
Tolerant

最近更新 : 2025-08-09 20:39

內容

請趕快離開,因為他太懂怎麼洗牌了。

給定一副有 $n$ 張的撲克牌堆 $A$,從牌堆上而下分別點數為 $A_1,A_2,...,A_n$,進行以下步驟:

1. 若牌堆剩一張牌,停止操作。(本次操作不算切牌)

2. 反之,可從下列兩種操作選擇一種:

    - 將牌堆分為上下兩堆 $x$ 與 $y$,並且將 $y$ 疊到 $x$ 上,也就是切牌。

    - 將牌堆分為上下兩堆 $x$ 與 $y$,但不做切牌。

   接著,將 $x$ 與 $y$ 分別視作獨立的牌堆,重複步驟 1.。

給定另一副有 $n$ 張的撲克牌堆 $B$,並且給你從牌堆上而下的點數 $B_1,B_2,B_3,...,B_n$,一位成熟的程式設計師應該用最少的切牌次數就將 $A$ 洗到與 $B$ 的點數排列完全相同,這樣才能好好地出老千。tree 也是一位程式設計師,但他並不成熟,請你幫幫他算出最少要切幾次牌吧!

輸入說明

第一行有一數 $T$,代表有 $T$ 組測資,每組測資間會換行。

對於每組測資:

第一行有一數 $n$,代表這副撲克牌有 $n$ 張。

第二行有 $n$ 個數,分別代表 $A_1,A_2,...,A_n$

第三行有 $n$ 個數,分別代表 $B_1,B_2,...,B_n$

輸出說明

對於每組測資,輸出一數,代表要切幾次牌才能得到目標牌堆。

若怎麼切牌都無法得到目標牌堆,輸出 $-1$。

每組測資間要換行。

範例輸入
3
5
1 2 3 4 5
4 5 2 3 1
8
1 2 3 4 2 3 2 4
4 2 4 2 3 2 3 1
4
1 2 3 4
3 1 4 2
範例輸出
2
3
-1
測資資訊:
記憶體限制: 18 MB
公開 測資點#0 (10%): 1.0s , <1K
公開 測資點#1 (20%): 1.0s , <1K
公開 測資點#2 (15%): 1.0s , <1M
公開 測資點#3 (15%): 1.0s , <1M
公開 測資點#4 (20%): 1.0s , <1M
公開 測資點#5 (20%): 1.0s , <1M
提示 :

$Subtask\;1\quad(10\%)\;$$#00$:$n\leq 13,\;\forall A_i,A_i=i$

$Subtask\;2\quad(20\%)\;$$#01$:$n\leq 13$

$Subtask\;3\quad(30\%)\;$$#02$$\sim$$#03$:$n\leq 26$

$Subtask\;4\quad(40\%)\;$$#04$$\sim$$#05$:無特殊限制

對於所有測資,$1\leq T\leq 20$,$1\leq n\leq 52$,$\forall A_i,B_i,\;1\leq A_i,B_i\leq 13$

以第二筆範例測資為例:

初始牌堆 1 2 3 4 2 3 2 4 分為 12 3 4 2 3 2 4,切牌得到 2 3 4 2 3 2 4 1

2 3 4 2 3 2 4 分為 2 34 2 3 2 4,切牌得到 4 2 3 2 4 2 3

4 2 3 2 4 分為 42 3 2 4,但不切牌。

2 3 2 4 分為 2 32 4,切牌得到 2 4 2 3

後續操作都不要切牌並慢慢將牌堆分割到剩一張牌,停止操作並合併牌堆後得到 4 2 4 2 3 2 3 1,期間共執行 $3$ 次切牌。

標籤:
出處:
[管理者:
fdhs109_tree (tree54145)
]


編號 身分 題目 主題 人氣 發表日期
沒有發現任何「解題報告」