目标
给你两个 正 整数 x 和 y ,分别表示价值为 75 和 10 的硬币的数目。
Alice 和 Bob 正在玩一个游戏。每一轮中,Alice 先进行操作,Bob 后操作。每次操作中,玩家需要拿出价值 总和 为 115 的硬币。如果一名玩家无法执行此操作,那么这名玩家 输掉 游戏。
两名玩家都采取 最优 策略,请你返回游戏的赢家。
示例 1:
输入:x = 2, y = 7
输出:"Alice"
解释:
游戏一次操作后结束:
Alice 拿走 1 枚价值为 75 的硬币和 4 枚价值为 10 的硬币。
示例 2:
输入:x = 4, y = 11
输出:"Bob"
解释:
游戏 2 次操作后结束:
Alice 拿走 1 枚价值为 75 的硬币和 4 枚价值为 10 的硬币。
Bob 拿走 1 枚价值为 75 的硬币和 4 枚价值为 10 的硬币。
说明:
- 1 <= x, y <= 100
思路
有价值 75
的硬币 x
个,价值 10
的硬币 y
个。Alice
与 Bob
轮流进行操作,每一次操作需要从中取出价值 115
的硬币,如果无法执行此操作则玩家输掉游戏。如果 Alice
先进行操作,最后的赢家是谁?
每次操作需要取 1
个 x
,4
个 y
,可以直接模拟,直到 x < 1
或 y < 4
。
这道题也有数学解法,输赢实际上取决于可以进行的操作次数。总共可以进行的操作次数是 Math.min(x,y/4)
,如果为偶数 Bob
胜,奇数 Alice
胜。
代码
/**
* @date 2024-11-05 9:14
*/
public class LosingPlayer3222 {
public String losingPlayer_v1(int x, int y) {
return Math.min(x, y / 4) % 2 == 0 ? "Bob" : "Alice";
}
public String losingPlayer(int x, int y) {
int cnt = 0;
while (x >= 1 && y >= 4) {
x--;
y -= 4;
cnt++;
}
return cnt % 2 == 0 ? "Bob" : "Alice";
}
}