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了,画蛇添足,且耗时。