Codeforces1445A题Python报错Not enough values to unpack如何解决
给定两个各包含n个正整数的数组
a和b,以及一个整数x。请判断是否可以重排数组b的元素,使得对每个i(1≤i≤n)都满足a_i + b_i ≤x。
本题为Codeforces 1445A题目,测试用例之间以空行分隔
输入样例
4 3 4 1 2 3 1 1 2 2 6 1 4 2 5 4 4 1 2 3 4 1 2 3 4 1 5 5 5
输出样例
Yes Yes No No
问题描述
编写的Python代码手动输入测试时运行正常,提交到Codeforces后报运行时错误Not enough values to unpack,原代码如下:
import sys def get_list(): return list(map(int, sys.stdin.readline().strip().split())) def get_ints(): return map(int, sys.stdin.readline().strip().split()) tests = int(input()) while tests != 0: size, limit = [int(x) for x in input().split()] p = get_list() q = get_list() for i in range(size): if p[i] + q[size-i-1] > limit: print("No") break else: print("Yes") tests = tests - 1
问题原因
- 未处理测试用例之间的空行:题目明确测试用例之间以空行分隔,代码遇到空行时,
split()会返回空列表,执行size, limit = ...赋值操作时没有足够的值解包,直接抛出错误。 - 输入读取方式混用:代码同时使用
input()和sys.stdin.readline()两种输入读取方法,不同环境下输入缓冲区的处理逻辑存在差异,可能导致读取到空内容。 - 解题逻辑缺失排序步骤:本题的标准贪心解法需要先将数组a升序排序、数组b降序排序再配对校验,原代码没有做排序操作,即使输入问题修复也无法通过测试用例。
修复方案
统一使用sys.stdin.readline()读取输入,新增空行过滤逻辑,同时补充数组排序步骤,修复后的代码如下:
import sys def read_non_empty_line(): while True: line = sys.stdin.readline() if not line: return '' stripped = line.strip() if stripped: return stripped def get_list(): return list(map(int, read_non_empty_line().split())) tests = int(read_non_empty_line()) for _ in range(tests): size, limit = map(int, read_non_empty_line().split()) a = get_list() b = get_list() # 排序:a升序,b降序 a.sort() b.sort(reverse=True) valid = True for ai, bi in zip(a, b): if ai + bi > limit: valid = False break print("Yes" if valid else "No")
内容的提问来源于stack exchange,提问作者user16980846
相关产品推荐
相关产品推荐

