题目给我们提供了 Q 个查询。在每个查询中,我们有两堆硬币,分别包含 A 和 B 枚硬币。在每一步操作中,我们可以选择从左边堆移除 1 枚硬币并从右边堆移除 2 枚硬币,或者从左边堆移除 2 枚硬币并从右边堆移除 1 枚硬币。我们的任务是高效地找出是否有可能清空这两堆硬币。
示例:
> 输入: Q = 3, queries[][] = {{2, 1}, {2, 2}, {3, 3}}
> 输出:
> YES
> NO
> YES
> 说明:
>
>
>
> – 在第一个查询中,我们可以从第一堆移除 2 枚硬币,并从第二堆移除 1 枚硬币,从而清空这两堆硬币。
> – 在第二个查询中,没有可能的方法清空这两堆硬币。
> – 在第三个查询中,我们可以先从第一堆移除 2 枚硬币,从第二堆移除 1 枚硬币,然后从第一堆移除 1 枚硬币,从第二堆移除 2 枚硬币。
>
> 输入: Q = 2, queries[][] = {{1, 1}, {2, 2}}
> 输出:
> NO
> NO
> 说明: 在第一个和第二个查询中,都没有可能的方法清空这两堆硬币。
解题思路: 为了解决这个问题,我们可以遵循以下思路:
> 对于一个查询,我们有 2 堆硬币,数量分别为 A 和 B。假设我们从第一堆移除 1 枚硬币的操作进行了 X 次,从第一堆移除 2 枚硬币的操作进行了 Y 次。因此,如果我们想要清空第一堆硬币,以下方程必须成立:
>
>
>
> 1 X + 2 Y = A (方程 1)
>
>
>
> 当我们从第一堆移除 1 枚硬币时,我们同时也从第二堆移除 2 枚硬币。类似地,当我们从第一堆移除 2 枚硬币时,我们同时也从第二堆移除 1 枚硬币。因此,如果我们想要清空第一堆硬币,以下方程必须成立:
>
>
>
> 2 X + 1 Y = B (方程 2)
>
>
>
> 化简上述方程,我们可以得到 X 的值为 (2 B – A)/3,Y 的值为 (2 A – B)/3。因此,要检查是否有可能清空这两堆硬币,(2 B – A) 必须是正数且能被 3 整除,同时 (2 A – B) 也必须是正数且能被 3 整除。
逐步算法:
- 输入查询的数量 Q 和 queries[][] 数组。
- 对于每个查询,检查 (1 X + 2 Y = A) 是否为正数且能被 3 整除,以及 (2 X + 1 Y = B) 是否为正数且能被 3 整除。
- 如果满足,则打印 "YES",否则打印 "NO"。
下面是该算法的实现:
C++
CODEBLOCK_95ddf778
Java
CODEBLOCK_38ad4219
C#
CODEBLOCK_0ccd335f