如何收集多组输入的数字对并在全部输入完成后统一输出
解决方案
两种方案都可以满足需求,你可以根据实际场景选择:
方案1:使用yield生成器实现
生成器完全支持多输入场景,即使为每个输入单独创建生成器也可以正常运行,优势是内存占用低,适合输出量极大的场景:
- 把单测试用例的逻辑封装为生成器函数,把原来
print的位置替换为yield返回对应字符串 - 遍历所有测试用例收集生成器,最后统一迭代所有生成器输出内容
示例修改逻辑如下:
from collections import defaultdict def gen_single_case(N, M): arrayOfNodes = [i for i in range(1, N + 1)] numberOfBridges = N - 1 edgesLeft = M - (N - 1) # 计算可减少的桥数量 bridgeBurn = defaultdict(int) bridgeBurn[1] = -2 count = -2 for edge in range(2, N): count -= 1 m = (edge * (edge + 1)) // 2 bridgeBurn[m] = count # 确定最终要减少的桥数量 bridgesToBurn = 0 for topInterval in bridgeBurn: if topInterval == edgesLeft: bridgesToBurn = bridgeBurn[topInterval] break elif topInterval > edgesLeft: bridgesToBurn = bridgeBurn[topInterval]+1 break finalNumberOfBridges = numberOfBridges + bridgesToBurn for edge in range(1, len(arrayOfNodes)): yield f"{arrayOfNodes[0]} {arrayOfNodes[edge]}" if M == N-1: return elif M > N - 1: while edgesLeft>0: for edge in range(2, N+1 - finalNumberOfBridges): for edge2 in range(edge + 1, N+1 - finalNumberOfBridges): yield f"{edge} {edge2}" edgesLeft -= 1 T = int(input()) # 先收集所有测试用例的生成器,此时已读完所有输入 generators = [] for _ in range(T): N, M = map(int, input().split()) generators.append(gen_single_case(N, M)) # 所有输入处理完成后统一打印 for gen in generators: for line in gen: print(line)
方案2:使用数组存储实现
操作更直观,如果你后续需要对输出内容做修改、排序等操作更方便,适合输出量不大的场景:
只需要初始化一个空列表,把原来print的位置替换为往列表追加内容,最后统一打印即可。
示例修改逻辑如下:
from collections import defaultdict T = int(input()) output = [] for _ in range(T): N, M = map(int, input().split()) arrayOfNodes = [i for i in range(1, N + 1)] numberOfBridges = N - 1 edgesLeft = M - (N - 1) # 计算可减少的桥数量 bridgeBurn = defaultdict(int) bridgeBurn[1] = -2 count = -2 for edge in range(2, N): count -= 1 m = (edge * (edge + 1)) // 2 bridgeBurn[m] = count # 确定最终要减少的桥数量 bridgesToBurn = 0 for topInterval in bridgeBurn: if topInterval == edgesLeft: bridgesToBurn = bridgeBurn[topInterval] break elif topInterval > edgesLeft: bridgesToBurn = bridgeBurn[topInterval]+1 break finalNumberOfBridges = numberOfBridges + bridgesToBurn for edge in range(1, len(arrayOfNodes)): output.append(f"{arrayOfNodes[0]} {arrayOfNodes[edge]}") if M == N-1: continue elif M > N - 1: while edgesLeft>0: for edge in range(2, N+1 - finalNumberOfBridges): for edge2 in range(edge + 1, N+1 - finalNumberOfBridges): output.append(f"{edge} {edge2}") edgesLeft -= 1 # 全部处理完成后统一打印 for line in output: print(line)
内容的提问来源于stack exchange,提问作者Patrick_Chong
相关产品推荐
相关产品推荐

