Description
为了抗击来势汹汹的 COVID19 新型冠状病毒,全国各地均启动了各项措施控制疫情发展,其中一个重要的环节是口罩的发放。
某市出于给市民发放口罩的需要,推出了一款小程序让市民填写信息,方便工作的开展。小程序收集了各种信息,包括市民的姓名、身份证、身体情况、提交时间等,但因为数据量太大,需要根据一定规则进行筛选和处理,请你编写程序,按照给定规则输出口罩的寄送名单。
Input
Output
对于每一天的申请记录,每行输出一位得到口罩的人的姓名及身份证号,用一个空格隔开。顺序按照发放顺序确定。
在输出完发放记录后,你还需要输出有合法记录的、身体状况为 1 的申请人的姓名及身份证号,用空格隔开。顺序按照申请记录中出现的顺序确定,同一个人只需要输出一次。
Sample Input
4 2
5 3
A 123456789012345670 1 13:58
B 123456789012345671 0 13:58
C 12345678901234567 0 13:22
D 123456789012345672 0 03:24
C 123456789012345673 0 13:59
4 3
A 123456789012345670 1 13:58
E 123456789012345674 0 13:59
C 123456789012345673 0 13:59
F F 0 14:00
1 3
E 123456789012345674 1 13:58
1 1
A 123456789012345670 0 14:11
Sample Output
D 123456789012345672
A 123456789012345670
B 123456789012345671
E 123456789012345674
C 123456789012345673
A 123456789012345670
A 123456789012345670
E 123456789012345674
样例解释:
输出中,第一行到第三行是第一天的部分;第四、五行是第二天的部分;第三天没有符合要求的市民;第六行是第四天的部分。最后两行按照出现顺序输出了可能存在身体不适的人员。
参考程序:
def CheckID(num):
if len(num)!=18:
return False
else:
try:
id_number=int(num)
return True
except:
return False
record={} #id:block
disabled=[]
information=[]
D,P=map(int,input().split())
for block in range(D):
T,S=map(int,input().split())
tmpls=[]
for i in range(T):
name,ID,status,time=input().split()
tmpls.append([name,ID,status,time,i])
disls=tmpls[:]
for info in disls:
if CheckID(info[1]):
if info[2]=="1" and [info[0],info[1]] not in disabled:
disabled.append([info[0],info[1]])
tmpls.sort(key=lambda x:(x[3],x[4]))
for info in tmpls:
if CheckID(info[1]):
if info[1] not in record.keys():
if S>0:
S-=1
record[info[1]]=block
information.append(info)
else:
break
else:
if S<=0:
break
else:
if block-record[info[1]]<P+1:
continue
else:
S-=1
record[info[1]]=block
information.append(info)
else:
pass
for info in information:
print("{0} {1}".format(info[0],info[1]))
for info in disabled:
print("{0} {1}".format(info[0],info[1]))
注:最容易出错的地方是,输出身体异常的人员信息,要按照输入的顺序排序(不考虑时间);而输出发放信息,先按照时间顺序再按照输入顺序排序。所以需要分开处理两种信息。