1 条题解
-
0
题意分析:
给定两个数,两个人每次从较大数中减去较小数的倍数,谁先得到谁获胜,为谁赢?
解题思路:
这个问题类似于“辗转相除法”的过程,但加入了博弈论的最优策略选择。关键观察点: 如果较大的数是较小数的倍数,当前玩家可以直接获胜(因为可以直接减去整个数得到)。 否则,当前玩家可以控制游戏走向必败态,让对手处于不利局面。
实现步骤:
令一种可能出现的整数对为,其中。有两种情况,只能从中减去一个,得到状态,那么如果是必胜态的话,就是必败态,反之同理。,可以从中减去至少个,假设可以从中最多可以减去个,那么从中减去个后得到状态,此时即为讨论的第一种情况。如果状态为必败态的话,那么就是必胜态,如果状态为必胜态的话,那么肯定是必败态,所以直接减去倍的,得到必败态,那么即为必胜态。
C++ 实现
#include <iostream> #include <algorithm> using namespace std; bool canWin(int a, int b, bool isStanTurn) { if (b == 0) return false; // 上一步已经赢了,当前玩家无法操作 if (a / b >= 2) return isStanTurn; // 可以一步获胜 return !canWin(b, a % b, !isStanTurn); // 否则进入下一状态 } int main() { int a, b; while (cin >> a >> b) { if (a == 0 && b == 0) break; bool stanWins; if (a < b) swap(a, b); // 确保 a >= b if (a == b) { stanWins = true; // 可以直接减去 b,Stan 直接获胜 } else { stanWins = canWin(a, b, true); } cout << (stanWins ? "Stan wins" : "Ollie wins") << endl; } return 0; }
- 1
信息
- ID
- 1349
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 7
- 已通过
- 1
- 上传者