阿里巴巴测试题 -- 取石子问题


题目:

有n个石子(n<=100),A、B双方轮流选取,每次取走若干个石子,取走最后一个石子的一方获胜。要求:第一次不能全部取完;各方每次选取的石子数不能为0,也不能超过上次对方选择的石子数。问:如果A先取,那么第一次应该选几个才能保证获胜?如果第一次有多种策略,则输出石子数最多的一种。


思路:这是一个博弈问题,参考了KingDragon0826的博客-阿里巴巴2017暑期实习生-算法工程师(机器学习)变成测验题的分析,如下图所示:
阿里巴巴测试题 -- 取石子问题_第1张图片


C++代码如下:

int Find(int n)
{
    int count = 1;
    int m = n;
    while (m != 1)
    {
        m = m / 2;
        count = 2 * count;
    }
    return n - count;
}

你可能感兴趣的:(c-c++,算法)