Python编程基础题(24-口罩发放)

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]))

注:最容易出错的地方是,输出身体异常的人员信息,要按照输入的顺序排序(不考虑时间);而输出发放信息,先按照时间顺序再按照输入顺序排序。所以需要分开处理两种信息。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值