1. 程式人生 > >不想出差的HR

不想出差的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; }