a095

輸入說明 :

輸入兩數N,M (1 < M <= N < 231) 代表N個犯人,M頂紅帽

輸出說明 :

輸出最少幾天所有犯人均可以確定自己的帽子顏色後出獄

對每個囚犯來說,紅帽的數量只有兩種可能,一種是假設自己是白帽,那對那個囚犯來說,紅帽的數量就是囚犯現在看到的,一種是假設自己是紅帽,紅帽的數量就是囚犯看到的紅帽的數量+1

每個囚犯只有知道自己不會死才會去找獄長

型1.

10個人有1頂紅帽,紅帽的那個人知道至少有一頂紅帽,他看到其他人都是白色,所以只有他是紅帽

型2.

10個人有2頂紅帽,紅帽1看到了1頂紅帽,紅帽2也看到了1頂紅帽,所有白帽的人看到了兩頂紅帽,對紅帽1.2來說最多有兩頂紅帽,對白帽的所有人來說最多有三頂紅帽

第二天紅帽1.2看到都沒有人走,代表紅帽1不確定他是不是紅帽,紅帽2也不確定他是不是紅帽,這時候白帽的人也不確定自己是不是紅帽,但是紅帽1知道紅帽2至少還看到了一頂紅帽,那一定是他,因為其他人都是白帽,紅帽2也是這樣覺得,第三天白帽的人看到紅帽都走了,所以他們知道自己是白帽

型3.

10個人有3頂紅帽,紅帽1.2.3都看到了兩頂紅帽,第二天沒有人走,這時候紅帽1假設自己是白帽,那應該明天他們兩個就會都走了,可是第三天,紅帽2.3都沒走,那代表說至少還有一頂紅帽,那一定是我,因為紅帽1看到其他人都是白帽,所以第三天,紅帽的人都走光,第四天白帽的人就知道自己是白帽了

注意對於型3所有白帽的人,他們在第三天的時候也都還不確定到底有3頂紅帽還是4頂紅帽,他們假設自己是白帽的話,那第四天三頂紅帽的人會走,假如第四天三頂紅帽的人還沒走,表是假設錯誤,還有一頂紅帽,就是自己,那就跳到型4,

最後注意人數根紅帽數一樣的時候,所需的天數會跟紅帽數-1的天數一樣

ex 10人9紅帽,和10人10紅帽一樣,因為第九天的的時候,大家都沒走,代表有九個紅帽,第十天剩一個白帽,或第十天大家都沒走,大家都是紅帽,大家一起走

註:賽局理論有一個遊戲叫dirty face也是這個問題

#include<stdio.h>
int main()
{
    int people;
    int hats;
    while(scanf("%d %d",&people,&hats)!=EOF)
    {   if(people==hats)
        printf("%d\n",people);
        else
        printf("%d\n",hats+1);
    }    
    return 0;
}