分组飞行器棋子 | 豆包MarsCode AI刷题

48 阅读3分钟

思路分析

我们可以通过以下步骤来解决这个问题:

  1. 统计棋子序号的出现次数:我们首先要统计每个棋子序号出现的次数。
  2. 判断是否能够分组:如果某个棋子的出现次数不能被 5 整除,则无法将其分组(因为每组必须包含 5 个相同的棋子)。
  3. 完成分组的条件:对于每一个棋子的出现次数,必须能够按照 5 的倍数分组,即每个棋子序号的出现次数应该是 5 的倍数。

步骤

  1. 读取输入,统计每个棋子序号的出现次数。
  2. 对每个棋子的出现次数进行判断,是否能整除 5。
  3. 如果所有棋子序号都满足条件,输出 true,否则输出 false

实现

from collections import Counter

def can_group(pieces):
    # 统计每个棋子序号的出现次数
    count = Counter(pieces)
    
    # 判断每个棋子序号的出现次数是否能被 5 整除
    for count_value in count.values():
        if count_value % 5 != 0:
            return False
    
    return True

# 输入处理
pieces = list(map(int, input().split()))

# 调用函数并输出结果
print("true" if can_group(pieces) else "false")

代码解析

  1. Counter(pieces):我们使用 Python 的 collections.Counter 来统计棋子序号出现的频次。Counter 会返回一个字典,键是棋子序号,值是该序号的出现次数。

  2. 判断每个棋子序号的次数是否能被 5 整除:我们遍历 Counter 的值,检查每个出现次数是否是 5 的倍数。如果某个次数不能被 5 整除,直接返回 false

  3. 返回结果:如果所有次数都能被 5 整除,返回 true

时间复杂度

  • 统计棋子出现次数的时间复杂度是 O(N),其中 N 是棋子数量。
  • 遍历字典的值来判断是否能被 5 整除的时间复杂度是 O(K),其中 K 是不同棋子序号的数量。在最坏情况下,K 的最大值是 40(因为棋子序号最大为 40)。

所以,整体的时间复杂度是 O(N + K),其中 N 最大为 10^5,K 最多为 40。该算法是高效的,能够处理问题的最大输入限制。

示例解析

示例 1

输入:

1 2 3 4 5
  • 统计出现次数:{1: 1, 2: 1, 3: 1, 4: 1, 5: 1}
  • 每个数字的出现次数都不是 5 的倍数,因此输出 false

输出:

false

示例 2

输入:

1 1 1 1 2 1 2 2 2 2
  • 统计出现次数:{1: 6, 2: 4}
  • 数字 1 的出现次数为 6,无法被 5 整除,因此输出 false

输出:

false

示例 3

输入:

1 1 1 1 1 2 2 2 2 2
  • 统计出现次数:{1: 5, 2: 5}
  • 数字 12 的出现次数都是 5,满足条件,可以分组。

输出:

true

总结

通过统计棋子序号的出现次数并检查是否能被 5 整除,我们能有效地判断是否能够将棋子分组。这个解法简洁且高效,能够处理大规模数据。