一、 题目描述
內容 :
在禁忌的貝殼城裡存在著一座監獄
有N個犯人被關在裡頭
我們只知道 .....
"他們都帶著帽子"
這是一頂神奇的帽子
稱作 "廬山帽"
是貝殼城裡的特產
分為紅色及白色兩種
凡是帶上 "廬山帽" 的人 .....
就會 "不識廬山真面目" !!!!
而監獄內的所有犯人都被配帶了這一頂可怕的帽子 0.0
而邪惡的所長麥哲倫想到了一個邪惡又沒有良心的鬼計畫:
" 猜帽子 "
只要能猜出自己的帽子顏色即可立即出獄
但猜錯者須以死謝罪
而你可以假設監獄裡的犯人都跟羅賓一樣絕頂聰明
不會有想要以死謝罪的白癡行為
因此,在N個犯人的監獄中,麥哲倫所長將M頂紅帽配給其中的犯人
請問最少需要幾天,監獄內的所有犯人均可以確定自己的帽子顏色後出獄
PS. 犯人並不知道共有幾頂紅帽,只知道紅帽至少有一頂,而且不可互相討論 = =
輸入說明 :
輸入兩數N,M (1 < M <= N < 231)
代表N個犯人,M頂紅帽
輸出說明 :
輸出最少幾天所有犯人均可以確定自己的帽子顏色後出獄
二、 解题思路
看到这道题,有许多冗杂的部分,于是我决定先把不必要的
部分删去,题目就变成了下面这个样子
“在N個犯人的監獄中,麥哲倫所長將M頂紅帽配給其中的犯人,請問最少需要幾天,監獄內的所有犯人均可以確定自己的帽子顏色後出獄”
人数其实不是问题,重点是红帽有几顶。
假设人数十人,如果一人红帽的话,除了红帽本人,其他人只能看到一顶红帽子。
所以第一天的时候戴红帽的就可以很确定只有他是红帽(因其视角只有白帽),所以开心地走了,第二天大家发现红帽不见了(太棒了!),聪明如罗宾的人自然明白红帽肯定是他,然后其他人就发现自己都是白帽
如果是两个白帽呢?
第一天因为戴红帽的有看到另一顶红帽所以没人会轻举妄动,到了第二天那个红帽发现另一个红帽没有走,他就推断出自己头上的是红帽,所以第二天两红帽都走了,第三天大家也都走了
故红帽的全部走完需要m天,剩下所有白帽子加一天。
注意,这里还有一个陷阱。
如果m==n?所有人都是红帽子,还要加一吗?于是我写出了这样的代码。
#include <iostream> using namespace std; int main(){ int a,b; while(cin >> a >> b){ if (a==b) cout << b; else cout << b + 1; cout << endl; } return 0; }