Python编程基础题(17-单身狗)

Description
单身狗”是中文对于单身人士的一种爱称。本题请你从上万人的大型派对中找出落单的客人,以便给予特殊关爱。

Input
输入第一行给出一个正整数 N(≤ 50 000),是已知夫妻/伴侣的对数;随后 N 行,每行给出一对夫妻/伴侣——为方便起见,每人对应一个 ID 号,为 5 位数字(从 00000 到 99999),ID 间以空格分隔;之后给出一个正整数 M(≤ 10 000),为参加派对的总人数;随后一行给出这 M 位客人的 ID,以空格分隔。题目保证无人重婚或脚踩两条船。

Output
首先第一行输出落单客人的总人数;随后第二行按 ID 递增顺序列出落单的客人。ID 间用 1 个空格分隔,行的首尾不得有多余空格。

在这里插入图片描述
参考程序

N=int(input())
partner=[-1 for i in range(100000)]
for i in range(N):
    a,b=map(int,input().split())
    partner[a]=b
    partner[b]=a
M=int(input())
ls=list(map(int,input().split()))#待检测的ID
attend=[0 for i in range(100000)]#是否参加
single=[0 for i in range(100000)]#是否落单
cnt=0#记录落单人数
for ID in ls:
    attend[ID]=1
for ID in ls:
    if partner[ID]==-1:#表示该ID没有配置partner
        cnt+=1
        single[ID]=1
    else:
        if attend[partner[ID]]==0:#partner没有参加
            cnt+=1
            single[ID]=1
if cnt==0:
    print(cnt)
else:
    print(cnt)
    t=0
    for i in range(len(single)):
        if single[i]==1:
            t+=1
            if t<=cnt-1:
                print("{:05d}".format(i),end=" ")
            else:
                print("{:05d}".format(i))
                break

说明:
本题对于程序的时间性能要求较高,且要格外注意一些细节。是一道非常好的编程题目!(PAT乙级 1065 单身狗)
①在选择用来模拟“伴侣关系”(一对一关系)的数据结构时,如果选择字典,这样在后面选“单身”的过程中,若用in关键字检索,会很耗时(理论上是O(n^2)时间复杂度)。
②选择出单身以后,再进行排序,这样理论上是O(n*logn)时间复杂度。也会超时。考虑到题目描述编号在100000内且不重复,因此可采用以空间换时间的策略,开辟0~100000的空间,这样就避免了排序,将时间复杂度降到O(n)。
③数据结构说明,列表partner[a]=b,partner[b]=a,描述a与b是伴侣关系;列表attend[i]=1表示编号为i的客人参加了(输入的最后一行,即待检测的人都会置1,默认初始置0);single列表描述是否为单身,
④输出的结果,若编号不足五位,应右对齐并将缺失位补0
⑤更高提高时间性能,判断single[i]==1,就不要加else:continue了,画蛇添足,且耗时。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值