Leetcode3021. Alice 和 Bob 玩鲜花游戏

Every day a Leetcode

题目来源:3021. Alice 和 Bob 玩鲜花游戏

解法1:数学

Alice 和 Bob 在一个长满鲜花的环形草地玩一个回合制游戏。环形的草地上有一些鲜花,Alice 到 Bob 之间顺时针有 x 朵鲜花,逆时针有 y 朵鲜花。

游戏过程如下:

  1. Alice 先行动。
  2. 每一次行动中,当前玩家必须选择顺时针或者逆时针,然后在这个方向上摘一朵鲜花。
  3. 一次行动结束后,如果所有鲜花都被摘完了,那么当前玩家抓住对手并赢得游戏的胜利。

给你两个整数 n 和 m ,你的任务是求出满足以下条件的所有 (x, y) 对:

  • 按照上述规则,Alice 必须赢得游戏。
  • Alice 顺时针方向上的鲜花数目 x 必须在区间 [1,n] 之间。
  • Alice 逆时针方向上的鲜花数目 y 必须在区间 [1,m] 之间。

请你返回满足题目描述的数对 (x, y) 的数目。

显然,因为是 Alice 先行动,当 x+y 为奇数时,Alice 会摘完最后一朵鲜花,抓住对手并赢得游戏的胜利。

x+y 为奇数有两种情况:

  1. x 为奇数,y 为偶数
  2. 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

结果:

Leetcode3021. Alice 和 Bob 玩鲜花游戏_第1张图片

复杂度分析:

时间复杂度:O(1)。

空间复杂度:O(1)。

解法2:数学

在这里插入图片描述

代码:

// 数学

class Solution
{
public:
    long long flowerGame(int n, int m)
    {
        return (long long)n * m / 2;
    }
};

结果:

Leetcode3021. Alice 和 Bob 玩鲜花游戏_第2张图片

复杂度分析:

时间复杂度:O(1)。

空间复杂度:O(1)。

你可能感兴趣的:(Every,day,a,LeetCode,数据结构与算法,leetcode,C++,数学)