HDU 2897 邂逅明下(巴什博弈)

當日遇到月,於是有了明。當我遇到了你,便成了侶。
那天,日月相會,我見到了你。而且,大地失去了光輝,你我是否成侶?這注定是個悽美的故事。(以上是廢話)
小t和所有世俗的人們一樣,期待那百年難遇的日食。駐足街頭看天,看日月漸漸走近,小t的脖子那個酸呀(他堅持這個姿勢已經有半個多小時啦)。他低下仰起的頭,環顧四周。忽然發現身邊竟站着位漂亮的mm。天漸漸暗下,這mm在這街頭竟然如此耀眼,她是天使嗎?站着小t身邊的天使。
小t對mm驚呼:“緣分吶~~”。mm卻毫不含糊:“是啊,500年一遇哦!”(此後省略5000字….)
小t趕緊向mm要聯繫方式,可mm說:“我和你玩個遊戲吧,贏了,我就把我的手機號告訴你。”小t,心想天下哪有題目能難倒我呢,便滿口答應下來。mm開始說遊戲規則:“我有一堆硬幣,一共7枚,從這個硬幣堆裏取硬幣,一次最少取2枚,最多4枚,如果剩下少於2枚就要一次取完。我和你輪流取,直到堆裏的硬幣取完,最後一次取硬幣的算輸。我玩過這個遊戲好多次了,就讓讓你,讓你先取吧~”
小t掐指一算,不對呀,這是不可能的任務麼。小t露出得意的笑:“還是mm優先啦,呵呵~”mm霎時愣住了,想是對小t的反應出乎意料吧。
她卻也不生氣:“好小子,挺聰明呢,要不這樣吧,你把我的郵箱給我,我給你發個文本,每行有三個數字n,p,q,表示一堆硬幣一共有n枚,從這個硬幣堆裏取硬幣,一次最少取p枚,最多q枚,如果剩下少於p枚就要一次取完。兩人輪流取,直到堆裏的硬幣取完,最後一次取硬幣的算輸。對於每一行的三個數字,給出先取的人是否有必勝策略,如果有回答WIN,否則回答LOST。你把對應的答案發給我,如果你能在今天晚上8點以前發給我正確答案,或許我們明天下午可以再見。”
小t二話沒說,將自己的郵箱給了mm。當他興沖沖得趕回家,上網看郵箱,哇!mm的郵件已經到了。他發現文本長達100000行,每行的三個數字都很大,但是都是不超過65536的整數。小t看錶已經下午6點了,要想手工算出所有結果,看來是不可能了。你能幫幫他,讓他再見到那個mm嗎?
Input
不超過100000行,每行三個正整數n,p,q。
Output
對應每行輸入,按前面介紹的遊戲規則,判斷先取者是否有必勝策略。輸出WIN或者LOST。
Sample Input
7 2 4
6 2 4
Sample Output
LOST
WIN
題意描述:
一堆硬幣一共有n枚,從這個硬幣堆裏取硬幣,一次最少取p枚,最多q枚,如果剩下少於p枚就要一次取完。兩人輪流取,直到堆裏的硬幣取完,最後一次取硬幣的算輸,問先先取着是否有必勝策略?
解題思路:
直接使用巴什博弈的模板來分析此題。
巴什博弈
對於一堆硬幣,最多去m個,不能不取,當剩下m+1個時先取着必勝,有此推出,剩下的是m+1的倍數先手爲必輸局,要是不是m+1的倍數爲必勝局,只需要取出多餘的就會爲對手留下必輸局。
類比到此題(1)n=(p+q)*t,A必勝,第一次A取q個,接下來B取k個那麼A再取(p+q-k)個,最後B一定會剩下p個,對於第二種情況(2)n=(p+q)*t+s,要是s<p則A面臨必輸局,因爲A取k個B取(p+q-k)個,最後A一定會剩下s個;要是p<s<=p+q個的話A爲必勝局在前前面的推到下剩下s,那麼A只需要取p個就會剩下s-p個讓B來取
Accept Code

#include<stdio.h>
int main()
{
    int n,p,q,t;
    while(scanf("%d%d%d",&n,&p,&q)==3)
    {
    t=n%(p+q);
    if(t>=1&&t<=p)
    printf("LOST\n");
    else
    printf("WIN\n");
    }
    return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章