Every day a Leetcode
题目来源:3021. Alice 和 Bob 玩鲜花游戏
解法1:数学
Alice 和 Bob 在一个长满鲜花的环形草地玩一个回合制游戏。环形的草地上有一些鲜花,Alice 到 Bob 之间顺时针有 x 朵鲜花,逆时针有 y 朵鲜花。
游戏过程如下:
- Alice 先行动。
- 每一次行动中,当前玩家必须选择顺时针或者逆时针,然后在这个方向上摘一朵鲜花。
- 一次行动结束后,如果所有鲜花都被摘完了,那么当前玩家抓住对手并赢得游戏的胜利。
给你两个整数 n 和 m ,你的任务是求出满足以下条件的所有 (x, y) 对:
- 按照上述规则,Alice 必须赢得游戏。
- Alice 顺时针方向上的鲜花数目 x 必须在区间 [1,n] 之间。
- Alice 逆时针方向上的鲜花数目 y 必须在区间 [1,m] 之间。
请你返回满足题目描述的数对 (x, y) 的数目。
显然,因为是 Alice 先行动,当 x+y 为奇数时,Alice 会摘完最后一朵鲜花,抓住对手并赢得游戏的胜利。
x+y 为奇数有两种情况:
- x 为奇数,y 为偶数
- x 为偶数,y 为奇数
在 [1,n] 区间内,有 n/2 个偶数,(n+1)/2 个奇数。
所以最终答案为 (n / 2) * ((m + 1) / 2) + ((n + 1) / 2) * (m / 2)。
代码:
/** @lc app=leetcode.cn id=3021 lang=cpp** [3021] Alice 和 Bob 玩鲜花游戏*/// @lc code=start// Time Limit Exceeded// class Solution
// {
// public:
// long long flowerGame(int n, int m)
// {
// long long count = 0;
// for (int x = 1; x <= n; x++)
// for (int y = 1; y <= m; y++)
// if ((x + y) ^ 0x1)
// count++;
// return count / 2;
// }
// };class Solution
{
public:long long flowerGame(int n, int m){return (long long)(n / 2) * ((m + 1) / 2) +(long long)((n + 1) / 2) * (m / 2);}
};
// @lc code=end
结果:
复杂度分析:
时间复杂度:O(1)。
空间复杂度:O(1)。
解法2:数学
代码:
// 数学class Solution
{
public:long long flowerGame(int n, int m){return (long long)n * m / 2;}
};
结果:
复杂度分析:
时间复杂度:O(1)。
空间复杂度:O(1)。