不想出差的HR

版权声明:欢迎指出文章不足之处~~~ https://blog.csdn.net/zhui_xiuge/article/details/79892712

题目链接:不想出差的HR

题意:
小招和小商要从三个科室中抽派面试官,每次从某个科室中选择至少一人。小招先选,最后选不到人的需要出差(失败),问两者都采取最优策略时,小招获胜情况(失败直接输出1,获胜输出第一步策略)

分析: 这是典型的Nim游戏,记p = s[0]^s[1]…s[n-1],若p为0,局面为P局面,即失败;否则,我们找到与p最高位1相同的s[i],将p与s[i]异或,最终的答案ans满足p^(s[i]-ans)=0

#include <iostream>

using namespace std;

int HighBit(int a)
{
    int cnt = 0;
    while (a)
    {
        a >>= 1;
        cnt++;
    }
    return cnt;
}

int main()
{   
    char c1, c2;
    int room[3];
    cin >> room[0] >> c1 >>  room[1] >> c2 >> room[2];//scanf可以格式化读入
    int p = 0;
    for (int i = 0; i < 3; i++)
    {
        p ^= room[i];
    }
    if (!p) cout << '1' << '\n';
    else
    {
        int i = 0;
        for (; i < 3; i++)
        {
            if (HighBit(room[i]) == HighBit(p)) //两者最高位的1相同
            {
                p ^= room[i];
                break;
            }
        }
        int ans;
        for (int j = room[i]-1; j >= 0; j--)
        {
            if (!(p^j))
            {
                ans = room[i] - j;
                break;
            }
        }
        cout << (char)('A' + i) << ',' << ans << '\n'; //'A'+i:%d
    }
    return 0;
}

参考:https://www.cnblogs.com/easonliu/p/4472541.html

猜你喜欢

转载自blog.csdn.net/zhui_xiuge/article/details/79892712