题目:
有n个石子(n<=100),A、B双方轮流选取,每次取走若干个石子,取走最后一个石子的一方获胜。要求:第一次不能全部取完;各方每次选取的石子数不能为0,也不能超过上次对方选择的石子数。问:如果A先取,那么第一次应该选几个才能保证获胜?如果第一次有多种策略,则输出石子数最多的一种。
思路:这是一个博弈问题,参考了KingDragon0826的博客-阿里巴巴2017暑期实习生-算法工程师(机器学习)变成测验题的分析,如下图所示:
C++代码如下:
int Find(int n)
{
int count = 1;
int m = n;
while (m != 1)
{
m = m / 2;
count = 2 * count;
}
return n - count;
}