1083.花生米(二)
时限:1000ms 内存限制:10000K 总时限:3000ms
描述
五一长假第二天,Tom和Jerry在仓库散步的时候又发现了一堆花生米(这个仓库还真奇怪)。这次Tom制定分花生米规则如下:
1、Tom和Jerry轮流从堆中取出k粒花生米吃掉,k可以是1,5,10中的任意一个数字;
2、为显示规则的公平性,Jerry可以选择先取或者后取。
Jerry当然还是希望最后一粒花生米被Tom吃掉。请计算,Jerry为了达到目的应该先取还是后取。
输入
本题有多个测例,每个测例的输入是一个整数n,n大于零小于等于1000,代表花生米的数量。
n等于0表示输入结束,不需要处理。
输出
每个测例在单独的一行内输出一个整数:Jerry先取输出1;Tom先取输出0。
输入样例
1
2
3
4
0
输出样例
0
1
0
1
解析:这个题目用动态规划算法求解,说一下思路。每次可以取1,5,10颗花生米,找到的办法应该是无论如何取,轮到Tom取的时候,只剩下一颗,Tom就只能取到这唯一的一颗,因为他不能不取。所以,对于输入的 n 颗花生米,若小于10的时候,只能取1或者5,所以10以内的数量,偶数颗则Jerry先取,因为每个人只能取奇数颗,自己只需要每次取一粒就可以让Tom拿到最后一个,当然10颗也是Jerry先取,因为只要不一下子取10颗,1或者5都是Tom拿到最后。对于超过10颗,如果这次取完(无论1,5,10取几颗)都是Jerry赢,那么就让Tom先取,否则一定要自己先取。所以这里的判断条件应该为
for(int i=11;i<=1000;i++)
{
if(peanut[i-1]==1&&peanut[i-5]==1&&peanut[i-10]==1)
peanut[i]=0;
else
peanut[i]=1;
}
这里的意思是,当前状态无论Tom取几颗最后都是Jerry赢,那么我就让Tom先取,否则我就一定要自己先取,因为我可以自己控制自己取的数量,来使得后面Tom取到最后一颗。代码如下:
#include <iostream>
#include<stdio.h>
using namespace std;
int n;
int peanut[1001];
int take()
{
for(int i=1;i<=10;i++)
{
if(i%2==0)
peanut[i]=1;
else
peanut[i]=0;
}
for(int i=11;i<=1000;i++)
{
if(peanut[i-1]==1&&peanut[i-5]==1&&peanut[i-10]==1)
peanut[i]=0;
else
peanut[i]=1;
}
return 0;
}
int main()
{
take();
while(scanf("%d",&n)&&n)
cout<<peanut[n]<<endl;
return 0;
}