1085.花生米(四)
時限:1000ms 內存限制:10000K 總時限:3000ms
描述
五一長假第四天,Tom逛了N個bbs,做了N^2個腦筋急轉彎題,終於發現了每次吃完花生米嘴裏都是苦味的原因:自己總會吃到最後一粒花生米。
五一長假第五天,Tom和Jerry在倉庫散步的時候發現了n堆花生米(這是什麼倉庫啊?!)。這次Tom制定分花生米規則如下:
???????1、首先選出最苦的一粒花生米,放到一個瓶子裏;
???????2、Tom和Jerry輪流從任意一堆花生米中取出任意粒吃掉;
???????3、如果Tom吃到最後一粒花生米(瓶子裏的花生米除外),Jerry必須吃掉瓶子裏的花生米;如果Jerry吃到最後一粒花生米(瓶子裏的花生米除外),Tom自願吃掉瓶子裏的花生米;
?????? 4、爲顯示規則的公平性,Jerry可以選擇先取或者後取。
Jerry當然希望瓶子裏的花生米被Tom吃掉。請計算,Jerry爲了達到目的應該先取還是後取。
輸入
本題有多個測例。
每個測例的輸入第一行是一個整數n,n大於零小於等於10,代表花生米的堆數(取出最苦花生米後);接下來n行每行一個不超過100的正整數,分別代表一堆花生米的粒數(取出最苦花生米後)。
n等於0表示輸入結束,不需要處理。
輸出
每個測例在單獨的一行內輸出一個整數:Jerry先取輸出1;Tom先取輸出0。
輸入樣例
2
1
1
2
1
100
0
輸出樣例
0
1
解析:這裏有 n 堆花生米,只要Jerry吃掉最後一粒花生米,那麼Tom就吃瓶子裏的。這麼說來的話,跟 n 堆有很大關係,我可以一次吃一堆,誰吃到最後一堆誰就是贏家,所以目標是Jerry要吃到最後一堆,即Tom吃完後應該只剩下一堆。
好,經過我一波仔細斟酌,發現我並get不到這道題的解法,然後我發現了一篇超強的博客並且copy了它,大哥對不起,粘上你的博客地址以示尊敬。http://www.cnblogs.com/tanky_woo/archive/2010/08/20/1804464.html,上面詳細講述了各種博弈,實屬不可多得的好文章,以下是copy代碼(豬不會做豬也很無奈啊):
#include <iostream>
using namespace std;
int a[10];
int b[10][7]; //2^7=128>100,7位小夠用了
int n;
int change();
void com(int m);
int main()
{
while(cin>>n&&n)
{
for(int i=0;i<n;i++)
cin>>a[i];
for(int i=0;i<n;i++)
{
for(int j=0;j<7;j++)
b[i][j]=0;
}
for(int i=0;i<n;i++)
com(i);
cout<<change()<<endl;
}
return 0;
}
int change()
{
int flag;
for(int i=0; i<7; i++)
{
flag=0; //0代表偶數個1
for(int j=0; j<n; j++) //遍歷n堆花生米
{
if(b[j][i]==1)
flag=1-flag; //奇數與偶數轉換
}
if(flag==1)
break; //一旦找到flag=1,證明第i位上有奇數個1,就退出循環
}
return flag;
}
void com(int m)
{
int t=a[m];
for(int i=0;i<7;i++)
{
b[m][i]=t%2; //將a[m]轉化成7位二進制表示的數
t=t/2;
}
}