【算法實驗四】--【動態規劃】--花生米(四)

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;
    }
}

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章