請在程式碼加入#include "lib1839.h"回答問題。
你在從學院到UQ 中心的漫長路程中迷路了。你意外地發現了通往學校地底秘密洞穴系統的入口。這個入口被一個有連續N個門的安全系統阻隔。這個系統有N個開關,分別連接到這 N 個不同的門。
這些門依序由0, 1, …, N - 1編號,其中最接近你的那扇門編號為0。開關的編號也是0, 1, …, N - 1,但是你並不知道哪一個開關連到哪一扇門。
開關都位於洞穴的入口處。每個開關可以被設定成上或下的位置。每一個開關只有一個位置是正確的。若一個開關被設定在正確的位置,則其連接到的門便會打開;若一個開關被設定在不正確的位置,則其連接到的門便會關閉。每一個開關的正確設定位置可能不相同,現在你並不知道開關的正確設定位置。
你想要了解這套安全系統。為了達到這個目的,你可以將開關設定成任何的位置組合,並且走入這個洞穴觀察第一個未開的門。這些門都是不透明的,當你發現第一個未開的門時,你無法看到任何後方的門。
你可以嘗試最多70,000種開關的位置組合。你的任務是決定每個開關的正確設定位置,以及每個開關連接到哪一扇門。
本題有多筆測試資料。
函式庫中將提供以下的函式
int Initialize():回傳數字 n。你必須要在每比測試資料一開始呼叫這個函式,如果你已經完成所有的測試資料,你的程式會自動被結束。
int tryCombination(const int S[]):這個函式允許你測驗一個開關設定組合,並得以進入洞穴來查看第一個未打開的門。假如所有的門都被打開了,這個函式會回傳 -1。
void answer(const int S[], const int D[]):在每比測試資料的最後,當你已經找出能打開所有門的開關位置設定和開關與洞門的連結關係時,請呼叫這個函式。
請不要做任何輸入動作,否則你會得到WA。
輸入資料格式如下。
第一行:N,表示開關與門的數量。
第二行:S[0] S[1] … S[N - 1],表示第i個開關開門的設定位置,只會是0或1。
第三行:D[0] D[1] … D[N - 1],表示第i個開關對應到的門(0~n-1)。
(Sample Input可以幫助你測試程式,但這不是你應該輸入的東西)
對於12%測資,已知開關 i 連到洞門 i。你只需要決定正確的開關設定位置。
對於13%測資,正確的開關設定位置已知是 [0, 0, 0, …, 0]。你只需決定開關與洞門的連結關係。
對於21%測資,N ≤ 100。
對於30%測資,N ≤ 2,000。
對於24%測資,N ≤ 5,000。
請不要做任何輸出動作,否則你會得到WA。
Sample :
tryCombination([1, 0, 1, 1]),return 1,參閱敘述中的圖片。開關0, 2 和3 的位置向下,開關1 的位置向上。函式回傳1,代表洞門編號1是第一個沒開的門。
tryCombination([0, 1, 1, 0]),return 3,洞門0, 1, 2打開了,洞門3 未開。
tryCombination([1, 1, 1, 0]),return -1,把開關0的位置設定向下,此時回傳-1,代表所有的門都打開了。
answer([1, 1, 1, 0], [3, 1, 0, 2]),我們猜測開關正確設定位置是[1, 1, 1, 0],而且開關0, 1, 2, 3 連結到洞門3, 1, 0, 2。
註:UQ是The University of Queensland的簡稱,2013IOI在澳洲UQ辦的喔!
IOI 2013
No. | Testdata Range | Score |
---|---|---|
1 | 0 | 1 |
2 | 1 | 12 |
3 | 2 | 13 |
4 | 3 | 21 |
5 | 4 | 30 |
6 | 5 | 23 |