花生米(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的专栏
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步