CSES 题解:硬币堆问题

题目给我们提供了 Q 个查询。在每个查询中,我们有两堆硬币,分别包含 AB 枚硬币。在每一步操作中,我们可以选择从左边堆移除 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 整除。

逐步算法:

  • 输入查询的数量 Qqueries[][] 数组。
  • 对于每个查询,检查 (1 X + 2 Y = A) 是否为正数且能被 3 整除,以及 (2 X + 1 Y = B) 是否为正数且能被 3 整除。
  • 如果满足,则打印 "YES",否则打印 "NO"。

下面是该算法的实现:

C++


CODEBLOCK_95ddf778

Java


CODEBLOCK_38ad4219

C#


CODEBLOCK_0ccd335f

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。如需转载,请注明文章出处豆丁博客和来源网址。https://shluqu.cn/37392.html
点赞
0.00 平均评分 (0% 分数) - 0