君子强

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

统计

花生米(2)

描述

五一长假第二天,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
 
 
复制代码
#include <stdio.h>
#include <stdlib.h>
int status[1001];
void search(){
    int i;
    /*花生米数量小于10时,双方只能取1粒或者5粒  
    在这种情况下,取一粒或者五粒的效果一样
    显然,如果有i粒,偶数个,先取赢,奇数个,后取赢
    */
    for(i=1;i<=10;i++){
        if(i%2==0)
            status[i]=1;
        else
            status[i]=0;
    }
    /*考虑i-1,i-5,i-10的情况,如果Jerry都是赢的,那么无论jerry怎么取都会剩下i-1或i-5或i-10个种子
    但是在这些情况下先取都是必赢得,即tom会赢。
    */
    for(i=11;i<1001;i++){
        if(status[i-1]&&status[i-5]&&status[i-10])
            status[i]=0;
            /*
                但是如果有一种情况jerry是输的,那么jerry先取时,就可选择这种情况
                例如,status[i-10]=0,那么jerry在先选时就可以拿走10个,即剩下i-10个是先选必输的,此时tom就输了,吃了最后一个花生米
            */
        else
            status[i]=1;
    }
}

int main()
{
    search();
    int num;
    while(scanf("%d",&num)!=EOF&&num){
        printf("%d\n",status[num]);
    }
    return 0;

}
复制代码

参考: axiqia的专栏

posted on   君子强  阅读(190)  评论(0编辑  收藏  举报

努力加载评论中...
点击右上角即可分享
微信分享提示