You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何收集多组输入的数字对并在全部输入完成后统一输出

解决方案

两种方案都可以满足需求,你可以根据实际场景选择:

方案1:使用yield生成器实现

生成器完全支持多输入场景,即使为每个输入单独创建生成器也可以正常运行,优势是内存占用低,适合输出量极大的场景:

  1. 把单测试用例的逻辑封装为生成器函数,把原来print的位置替换为yield返回对应字符串
  2. 遍历所有测试用例收集生成器,最后统一迭代所有生成器输出内容

示例修改逻辑如下:

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 01:36:00