HDOJ HDU 1850 Being a Good Boy in Spring Festival ACM 1850 IN HDU
Posted on 2010-08-09 20:04 MiYu 閱讀(786) 評(píng)論(1) 編輯 收藏 引用 所屬分類: ACM ( 組合 ) 、ACM ( 博弈 )題目地址:
http://acm.hdu.edu.cn/showproblem.php?pid=1850
題目描述:
一年在外 父母時(shí)刻牽掛
春節(jié)回家 你能做幾天好孩子嗎
寒假里嘗試做做下面的事情吧
陪媽媽逛一次菜場(chǎng)
悄悄給爸爸買個(gè)小禮物
主動(dòng)地 強(qiáng)烈地 要求洗一次碗
某一天早起 給爸媽用心地做回早餐
如果愿意 你還可以和爸媽說(shuō)
咱們玩?zhèn)€小游戲吧 ACM課上學(xué)的呢~
下面是一個(gè)二人小游戲:桌子上有M堆撲克牌;每堆牌的數(shù)量分別為Ni(i=1…M);兩人輪流進(jìn)行;每走一步可以任意選擇一堆并取走其中的任意張牌;桌子上的撲克全部取光,則游戲結(jié)束;最后一次取牌的人為勝者。
現(xiàn)在我們不想研究到底先手為勝還是為負(fù),我只想問(wèn)大家:
——“先手的人如果想贏,第一步有幾種選擇呢?”
Input
輸入數(shù)據(jù)包含多個(gè)測(cè)試用例,每個(gè)測(cè)試用例占2行,首先一行包含一個(gè)整數(shù)M(1<M<100),表示撲克牌的堆數(shù),緊接著一行包含M個(gè)整數(shù)Ni(1<=Ni<=1000000,i=1…M),分別表示M堆撲克的數(shù)量。M為0則表示輸入數(shù)據(jù)的結(jié)束。
Output
如果先手的人能贏,請(qǐng)輸出他第一步可行的方案數(shù),否則請(qǐng)輸出0,每個(gè)實(shí)例的輸出占一行。
Sample Input
3
5 7 9
0
Sample Output
1
題目分析 :
MiYu原創(chuàng), 轉(zhuǎn)帖請(qǐng)注明 : 轉(zhuǎn)載自 ______________白白の屋
一.
如果a1^a2^a3^...^an=0 ( 即 : nim-sum=0 ) , 說(shuō)明先手沒(méi)有必贏策略, 方法數(shù)肯定為 0;
二.
假設(shè)先手的人有必贏策略。
問(wèn)題則轉(zhuǎn)化為=>在任意一堆拿任意K張牌,并且剩下所有堆的nim-sum=0(P-position)的方案總數(shù)。
1. 現(xiàn)在我們先看一個(gè)例子(5,7,9),并假設(shè)從第一堆取任意K張牌。
排除第一堆牌的nim-sum為 7^9=14
0111
^1001
-------
1110
如果要使所有堆的nim-sum=0成立,則第一堆取掉K張以后必定為1110,因?yàn)閄^X=0。
所以要觀察 5-k=14 k>0 成立,此例子(在第一堆取任意K張牌)明顯的不成立。但并不代表在第二或第三堆取任意K張牌的解不成立。
2. 現(xiàn)在看第二個(gè)例子(15,7,9),并假設(shè)從第一堆取任意K張牌。
排隊(duì)第一堆牌的nim-sum為7^9=14,和第一個(gè)例子相同,所以問(wèn)題變?yōu)橛^察 15-k=14 k>0 是否成立。
當(dāng)然這個(gè)例子是成立的。
三.
總結(jié)得出:
在任意一堆拿任意K張牌,并且所有堆的nim-sum=0 成立的條件為:排除取掉K張牌的那一堆的nim-sum必須少于該堆牌上的數(shù)量(例子二),否則不能在此堆上取任意K張牌使所有堆的nim-sum=0成立(例子一)。
故總方案數(shù)為 ( 在任意一堆拿任意K張牌,并且所有堆的nim-sum=0 成立 ) 的總數(shù)。
代碼如下 :
#include <iostream>
int heap[101];
int main ()
{
int T;
while ( scanf ( "%d",&T ), T )
{
int res = 0 , nCount = 0;
for ( int i = 0; i != T; ++ i )
{
scanf ( "%d",heap + i );
res ^= heap[i];
}
if ( res == 0 )
{
puts ( "0" );
continue;
}
int cmp = 0;
for ( int i = 0; i != T; ++ i )
{
cmp = res ^ heap[i];
if ( cmp < heap[i] )
{
nCount ++;
}
}
printf ( "%d\n",nCount );
}
return 0;
}