B. Fortune Telling

https://codeforces.com/problemset/problem/1634/B

题意:给定n个数,Alice和Box玩游戏,Alice的初始数值是x,Bob是x+3,再给一个定值y,问,alice和bob谁能够通过连续对n个数进行操作后得到y。可以执行的操作类型:加上当前的数或者异或当前的数,题目保证一定有一个人可以win。

思路:思维题,直接对输入x与n个数做xor操作,最后看x是否与y的奇偶性相同,如果相同,则alice胜,否则bob胜。为什么这么做?我们只考虑x的最低位,不管是与别的数相加或者异或,最后最低位一定是一样的。举例,0 + 0 = 0 ^ 0, 1 + 0 = 1 ^ 0, 1 + 1 = 1 ^ 1,可以推出最低位是个定值,而题目保证了只有一个人可以win,并且Bob是x + 3,所以alice和bob的奇偶性是不同的,那么只要看最后谁的最低位跟y的最低位是一样的,就可以知道答案了。

总结:第一天看到题目想了一会没想到,第二天看了solution的提示后才想出来。异或跟加法的共性,在这个题目里体现在了奇偶性上,并且题目保证了一定只有一个解,那么就不需要考虑操作的排列组合的问题了。

inline void solve(){
    long long n, x, y;
    cin >> n >> x >> y;


    for (int i = 0; i < n; ++i) {
        int t;
        cin >> t;
        x ^= t;
    }

    if ((x & 1) == (y & 1)) {
        cout << "Alice" << '\n';
    }
    else {
        cout << "Bob" << '\n';
    }
}
posted @ 2025-03-13 10:12  _Yxc  阅读(12)  评论(0)    收藏  举报