版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。
626 篇文章5 订阅
订阅专栏
这种问题网上有很多版本,如下所示:
但是总根数和每次取走的数目可能不相同,甚至以后可能变幻题目,比如直接让你取数,只能取1或者2或者3,不过道理都是一样的,其实这道题我们在小学或者初中的时候就接触过,我印象是一道课后探索题,貌似在数学书的背面,哈哈哈,不管了不管了,接下来就以下面这道例题为大家讲述一下这种类型题的做法:
例题:桌子上面放着34根火柴棒,甲、乙两人轮流再次取走1~3根,规定谁取走最后一根火柴棒谁获胜,甲想获胜应该先去还是后取,怎么取?
解析:虽然每次取走的根数在变化,但是甲乙取得根数之和可以不变,这个和就是4,也就是1和3相加的结果,为什么选择这个数字呢,无论其中一人取什么,另外一人都可以让两人之和等于4,例如:
甲:1;乙:3; 甲:2;乙:2; 甲:3;乙:1;
有些同学可能会问了,为什么不是3或者5呢?因为这两个数字不是在任何情况下都成立的,比如甲取3根,乙怎么取,这就不能总数等于3了,又比如甲取1根,乙怎么取也不可能等于5,所以其他的数字不成立
接下来可以让总根数/(1+3)就会得到一个余数,接下来分两种情况讨论:
余数=0:想赢的人应该后取,后面取的数目和应该和对方每次取的相加等于4,这样就可以取得胜利,也就是我们可以按照4为单位一点一点取到最终的数;
余数>0:想赢的人应该先取,第一次取的数目等于余数,后面取的数目和应该和对方每次取的相加等于4,这样就可以取得胜利。
总结:
通过总数/(最小值+最大值)就会得到一个余数,分两种情况讨论如下:
余数=0:想赢的人应该后取,后面取的数目和应该和对方每次取的相加等于4,这样就可以取得胜利。
余数>0:想赢的人应该先取,第一次取的数目等于余数,后面取的数目和应该和对方每次取的相加等于最小值和最大值之和,这样就可以取得胜利。
收藏
一键三连
扫一扫,分享海报
专栏目录
题目描述: 有一个数组,A和B竞赛,规则是:A先取数组两端中的一个数,然后B在剩下的数组两端取一个数,然后A取,B取…,直至数组取完,假如A中所有数之和>=B,则输出true,否则输出false。 动态规划递推公式: 设f[m][n],表示数组num[m]-num[n]间,A的积分 - B的积分 //A取左边 temp1 = min(num[m]-num[m+1]+f[m+2][n], num[
#include using namespace std; ///////////////////////////////////////////////////////////////////////////////// //现有21根火柴,两人轮流取,每人每次可取走1-4根,不可多取,也不能不取,谁取最后// //一根火柴则谁输。请编写一个程序进行人机对弈,要求人先取,计算机后取;计算机一
取火柴 (10分)C时间限制:3000 毫秒 | C内存限制:3000 Kb题目内容: 有n个火柴棍,两个游戏玩家a和b轮流取,规则是第一次取的人最少取1根,最多取n-1根,随后每人最多只能取对方上一次取的数目 的2倍,最少取1根。谁取到最后一根为胜者。试问先取的人是赢还是输。 输入描述n输出描述1表示胜,0表示输输入样例3输出样例0 解析:回溯。 转载于:https://www.cnbl...