BZOJ2523 Ctsc2001 聰明的學生

2022-05-09 16:11:10 字數 2415 閱讀 8248

[bzoj2523][ctsc2001]聰明的學生

試題描述

一位教授邏輯學的教授有三名非常善於推理且精於心算的學生a,b和c。有一天,教授給他們三人出了一道題:教授在每個人腦門上貼了一張紙條並告訴他們,每個人的紙條上都寫了乙個正整數,且某兩個數的和等於第三個。於是,每個學生都能看見貼在另外兩個同學頭上的整數,但卻看不見自己的數。

這時,教授先對學生a發問了:「你能猜出自己的數嗎?」a回答:「不能。」

教授又轉身問學生b:「你能猜出自己的數嗎?」b想了想,也回答:「不能。」

教授再問學生c同樣的問題,c思考了片刻後,搖了搖頭:「不能」。

接著,教授又重新問a同樣的問題,再問b和c,……,經過若干輪的提問之後,當教授再次詢問某人時,此人突然露出了得意的笑容,把貼在自己頭上的那個數準確無誤的報了出來。

現在,如果告訴你:教授在第n次提問時,輪到回答問題的那個人猜出了貼在自己頭上的數是m,你能推斷出另外兩個學生的頭上貼的是什麼數嗎?

[提示]

在沒有人猜出自己頭上的數之前,大家對教授提問的回答始終都是「不能」;而且除此之外在a,b,c之間是沒有進行任何資訊交流的。也就是說,每個人推斷的依據僅僅是另外兩個人的頭上數,以及大家對教授的提問所做出的否定回答。

教授總是從學生a開始提問的。

你可以假定,這三個足夠聰明的學生能夠根據已知的條件在最早的輪次猜出自己的數,並且永遠都不會猜錯。

稍經分析和推理,你將得出以下結論:總是頭上貼著最大的那個數的人最先猜出自己頭上的數。

輸入

包括若干組測試資料,其中的每一行代表一組測試資料,由兩個整數n和m組成(即在教授第n次提問時,輪到回答問題的那個人猜出了貼在自己頭上的數是m)。兩個數之間用空格分隔開。最後,由-1 -1組成的一行標誌著輸入資料的結束。

0輸出

按照輸入檔案中的順序依次給出各組資料的結果。

檔案中對應每組資料的輸出的第一行是乙個整數p,是可能情況的總數。接下來的p行,每一行包括三個數,分別為貼在a,b,c頭上的三個數。輸出時,所有解按照a頭上的數增序排列;在a頭上的數相同的情況下,按照b頭上的數增序排列。

輸入示例

583

223-1  -1

輸出示例

328

6583

6821

1121

231

資料規模及約定

見「輸入

題解

我是因為喜歡這題題號才做這題的。。。

整個題面有用的話只有最後一句:「總是頭上貼著最大的那個數的人最先猜出自己頭上的數。」

那麼對於乙個局面 (x, y, x+y),不妨設 x > y,那麼 x+y 那個人能猜出自己腦袋上的數當且僅當他能排除自己腦袋上的數是 x-y 的可能性。怎麼排除?就是假設自己腦袋上是 x-y,那麼由於他知道另外兩個人的數是啥(即 x 和 y),他也知道 x > y,那麼就是說 (x, y, x-y) 中最大的是 x,那麼如果在輪到頭上是 x 的那個人在他理應猜出來的那步時還回答不出來,就說明自己頭上的數不可能是 x-y,那麼就可以從 (x, y, x-y) 這個局面的答案退出 (x, y, x+y) 這個局面的答案了。

最後我們暴力列舉可能的初始狀態然後用迭代代替遞迴,就 rank 1 了。

#include #include #include #include #include #include using namespace std;

int read()

while(isdigit(c))

return x * f;

}#define maxn 30010

int nxt[4] = , pre[4] = ;

struct tri

tri(int _1, int _2, int _3): a(_1), b(_2), c(_3) {}

bool operator < (const tri& t) const

} ans[maxn];

bool check(int x, int y, int p, int n)

else

int a[4]; a[p] = x + y; a[nxt[p]] = x; a[pre[p]] = y;

} return 0;

}int main()

sort(ans + 1, ans + cnt + 1);

printf("%d\n", cnt);

for(int i = 1; i <= cnt; i++) printf("%d %d %d\n", ans[i].a, ans[i].b, ans[i].c); }

return 0;

}

BZOJ 1919 Ctsc2010 效能優化

題目 題意 給出兩個長度為 n 的整數序列a 0.n 1 b 0.n 1 和非負整數 c 對於兩個長度為 n的整數序列,定義 運算,結果為乙個長度為 n的整數序列,例如f g h 則有h k i j k modn f i g j 求a b b b 每一位模 n 1 的值,其中有 c 個 運算,n 1...

bzoj 2306 Ctsc2011 幸福路徑

有向圖 g有n個頂點 1,2,n,點i 的權值為 w i 現在有乙隻螞蟻,從 給定的起點 v0出發,沿著圖 g 的邊爬行。開始時,它的體力為 1。每爬過一條邊,它的體力都 p,而螞蟻爬到某個頂點時的幸福度,是它當時的體力與該點權值的乘積。求最大幸福值。因為當體力很小後,對答案就沒什麼影響力,所以用乙...

BZOJ 5343 Ctsc2018 混合果汁

bzoj 5343 ctsc2018 混合果汁 二分答案 主席樹 題意 給出每個果汁的 p,美味度d,最多能放的體積l。定義果汁混合後的美味度為果汁的美味度的最小值。m次詢問,要求花費不大於g,總體積不小於l,求最大美味度,如果不能滿足,輸出 1。二分答案。然後轉變為求 前l小的果汁之和。類似任務查...