不想出差的HR
阿新 • • 發佈:2019-02-15
題意:
小招和小商要從三個科室中抽派面試官,每次從某個科室中選擇至少一人。小招先選,最後選不到人的需要出差(失敗),問兩者都採取最優策略時,小招獲勝情況(失敗直接輸出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;
}