
本教程详解如何解决“half sum element”问题:输入n个整数,判断是否存在某个数等于其余所有数的和;若存在则输出“yes”及该数,否则输出“no”及最大数与其余数之和的绝对差值。
本教程详解如何解决“half sum element”问题:输入n个整数,判断是否存在某个数等于其余所有数的和;若存在则输出“yes”及该数,否则输出“no”及最大数与其余数之和的绝对差值。
要正确解决该问题,核心在于一次遍历完成两件事:累加所有数字的总和,同时实时更新最大值。原代码中存在两个关键错误:
- 重复读取输入:外层循环读取了 n 个数但未做处理;内层循环又再次读取 n 个数,导致前 n 个输入被丢弃,程序实际只处理了后 n 个(而用户仅输入 n+1 行),极易引发 EOFError 或逻辑错位;
- 条件判断错误:当判定成功时,输出的是 sum_numbers(即总和),但题目要求输出的是那个“等于其余数之和”的元素值——它恰好等于 max_num(因为 max_num == sum_numbers - max_num ⇒ max_num == sum_numbers / 2),因此应输出 max_num,而非总和。
以下是修正后的完整、健壮实现:
import sys
n = int(input())
if n == 0:
print("No")
print("Diff = 0")
else:
numbers = []
total_sum = 0
max_num = -sys.maxsize
for _ in range(n):
num = int(input())
numbers.append(num)
total_sum += num
if num > max_num:
max_num = num
# 检查是否存在一个数等于其余所有数之和
# 即:max_num == total_sum - max_num → total_sum == 2 * max_num
if max_num == total_sum - max_num:
print("Yes")
print(f"Sum = {max_num}")
else:
rest_sum = total_sum - max_num
diff = abs(max_num - rest_sum)
print("No")
print(f"Diff = {diff}")
✅ 关键改进说明:
- 单次输入、单次处理:每个数字仅读取一次,并同步更新 total_sum 和 max_num;
- 显式变量语义清晰:使用 rest_sum 明确表示“除最大值外的其余数之和”,提升可读性与可维护性;
- 边界防护:补充 n == 0 的安全处理(虽题目隐含 n ≥ 1,但工程实践中建议覆盖);
- 逻辑等价验证:max_num == total_sum - max_num 等价于 2 * max_num == total_sum,确保数学含义准确。
⚠️ 注意事项:
- 题目未限定“唯一解”,但根据判定逻辑(仅检查最大值是否满足条件),若存在满足条件的数,则它必为最大值(因其余数之和非负时,满足条件的数不可能小于其他任一正数;即使含负数,该数仍需 ≥ 其余数之和,故至少不小于其余任意单个数)。因此只检查最大值是充分且高效的;
- 若题目后续扩展为“任意一个满足条件的数(不一定是最大值)”,则需遍历每个数验证 num == total_sum - num,此时时间复杂度仍为 O(n),但需额外存储所有数。
掌握此题的关键,在于理解“某数 = 其余数之和” ⇔ “该数 = 总和的一半”,从而将问题转化为对极值的高效验证——这是典型贪心思维在数组问题中的简洁应用。










