题目链接:不想出差的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;
}