Problem K. 取沙子游戏
https://codeforces.com/gym/105336
代码
cpp
#include <bits/stdc++.h>
#define endl "\n"
using namespace std;
int lowbit(const int &n) // 求lowbit
{
return n & (-n);
}
void Solution() // Solution一般来说不用传参
{
int n, k; // n粒沙子,每次取沙子,且数量不超过k
cin >> n >> k;
if (k >= n) // 1.如果k>=n,则Alice可以一次取完,必胜。
{
cout << "Alice" << endl;
return;
}
// k<n的情况
if (lowbit(n) <= k) // 2.如果lowbit小于等于k,则Alice必赢。Alice取lowbit,后面不管Bob怎么取,都和Bob取一样的,这样Alice肯定是。3.这里面包含了n为奇数,则Alice第一次取一个就必胜的情况。因为此时lowbit(n)=1,一定满足lowbit(n)<=k。
{
cout << "Alice" << endl;
return;
}
else // 4.否则的话,Alice不一定赢
{
cout << "Bob" << endl;
return;
}
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(nullptr);
int T; // T组数据
cin >> T;
while (T--)
{
Solution();
}
return 0;
}
这道题思路很重要,总共分为四种情况。
k>=n
。这种情况下,Alice可以在第一次直接全部取完,Alice必胜。- n为奇数。Alice第一次取一个就必胜。(这也是
lowbit(n)<=k
的情况,代码中没有另外作为一种情况写出) - n为偶数且
lowbit(n)<=k
。这种情况下,只要Alice第一次取lowbit(n)
,后面不管Bob取什么,Alice都和Bob选一样的,就可以使得除了第一次Alice取的次数外取了偶数次,Alice必赢。 - n为偶数且
lowbit(n)>k
。这种情况下,Alice就不一定必胜,所以输出Bob。
- 补充
lowbit
知识。Lowbit
函数是一种特殊的位操作,用于找到一个数的最低位的1。
cpp
int lowbit(const int &n) // 求lowbit
{
return n & (-n);
}
传奇计算机大神miyou的亲笔稿: