酷代码 AI
菜单

星宇博士给禾木出了一道数字游戏。 禾木会得到 n n 个整数 a 1 , a 2 , … , a n a 1 ​ ,a 2 ​ ,…,a n ​ 。禾木可以从这些整数中不断挑出两个数字相加,如果它们的和是 3 3 的倍数,则这两个整数就被消除,直到不能再消除数字为止。 请问禾木最多能消除多少对数字?

以下是对这个问题的分析与解决方案: 问题分析 要想让消除的数字对数量达到最多,我们可以依据这些整数除以 3 的余数对它们进行分类。一个整数除以 3 的余数只有 0、1、2 这三种情况。 - 余数为 0 的两个数相加,和必然是 3 的倍数。 - 余数为 1 的数与余数为 2 的数相加,和同样是 3 的倍数。 算法思路 1. 对所有整数除以 3 的余数进行统计,分别记录余数为 0、1、2 的整数的数量,记为 `count0`、`count1`、`count2`。 2. 余数为 0 的数两两组合,可消除的对数为 `count0 // 2`。 3. 余数为 1 的数和余数为 2 的数进行配对,可消除的对数为 `min(count1, count2)`。 4. 把这两部分消除的对数相加,就能得到最多可消除的数字对数量。 代码实现 ```python def max_pairs_to_eliminate(n, numbers): # 初始化余数计数器 count0 = 0 count1 = 0 count2 = 0 # 统计余数为 0、1、2 的数字的数量 for num in numbers: remainder = num % 3 if remainder == 0: count0 += 1 elif remainder == 1: count1 += 1 else: count2 += 1 # 计算最多可消除的数字对数量 pairs_from_remainder_0 = count0 // 2 pairs_from_remainder_1_2 = min(count1, count2) # 总消除对数 total_pairs = pairs_from_remainder_0 + pairs_from_remainder_1_2 return total_pairs # 读取输入 n = int(input()) numbers = list(map(int, input().split())) # 计算并输出结果 result = max_pairs_to_eliminate(n, numbers) print(result) ``` 复杂度分析 - 时间复杂度:$O(n)$,这里的 $n$ 是整数的数量。我们只需对所有整数遍历一次,就能完成余数的统计。 - 空间复杂度:$O(1)$,只需要常数级的额外空间来存储余数的计数器。 示例 假设输入如下: ``` 5 1 2 3 4 5 ``` 程序会先统计出余数为 0 的数有 1 个(数字 3),余数为 1 的数有 2 个(数字 1 和 4),余数为 2 的数有 2 个(数字 2 和 5)。 - 余数为 0 的数可消除的对数为 `1 // 2 = 0`。 - 余数为 1 和余数为 2 的数可消除的对数为 `min(2, 2) = 2`。 - 总共可消除的数字对数量为 `0 + 2 = 2`。 程序会输出 `2`。 [2026-01-27 20:05:34 | AI问答 | 739点数解答]

服务商
相关提问
发财导航,免费问AI
实用工具查看更多