[Python与CSP的姻缘]202209-3 防疫大数据

题目

题目较长,请查看2022年9月第三题

题解

主要题解在100分代码中进行标注

记录一下这次做题过程哈哈,好魔幻哈哈哈
一开始感觉思路应该不算很过分,就是一开始感觉存储那些数据有点乱
小菜鸟做不下去了在就开始看题解哈哈,一开始提交得了40分,有一行没看懂改了个字母变成了70分,又加了个检测字典中是否有这个日期的if语句变80分,后来想把40分的代码看看哪的问题改成80分,结果意外变成了100昏!😆
妈妈咪呀,虽然我很菜,但是好好笑哈哈哈😂

下面记录了40-80-100的提交代码

40分

n = int(input()) # 输入n,代表数据的天数
place = {}  # key标记日期,value标记风险地区
people = {} # key标记日期,value标记当天所有的漫游数据
for i in range(n):
    data = list(map(int,input().split())) # 输入当日收到的风险地区信息的数量、当日收到的漫游数据的条目数量,以及当日收到的风险地区的列表
    r,m = data[0],data[1]

    if r!=0:
        for d in data[2:]:      # 地点
            for q in range(i,i+7):
                if q not in place:
                    place[q] = set()
                if d not in place[q]:
                    place[q].add(d)

    if m!=0:
        for _ in range(m):
            ud,u,ur = map(int,input().split())
            if ud < 0:
                continue
            if i not in people:
                people[i] = []
            people[i].append([ud,u,ur])

    t = max(0,i-6)

    out = []
    for h in range(t,i+1):
        if h not in people:
            continue
        hu = people[h]
        for kd,ku,kr in hu:            
            flag = 1
            for l in range(kd,i+1):
                if l not in place or kr not in place[l]:
                    flag = 0
                    break
            if flag:
                out.append(ku)
    out = list(set(out))
    out.sort()
    out.insert(0,i)
    print(*out)

80分

n = int(input())
# 设置place来存储每天的风险地区
place = {}  # key标记日期,value标记风险地区
# 设置people来存储用户的漫游数据
people = {} # key标记日期,value标记当天所有的漫游数据
# 开始遍历每一天
for i in range(n):
    data = list(map(int,input().split()))
    r,m = data[0],data[1]

    # 存储当日收到的风险地区的列表
    if r!=0:
        for d in data[2:]:
            # 遍历将从今日起的风险地区标记七日风险
            for q in range(i,i+7):      # 7个日期都加入风险地区
                if q not in place:      # 判断是否已经有这个日期的记录
                    place[q] = set()
                # if d not in place[q]:   # 判断是否已经有这个风险地区的记录
                place[q].add(d)

    if m!=0:
        for _ in range(m):
            ud,u,ur = map(int,input().split())
            if ud<0:
                continue
            if i not in people:
                people[i] = []
            people[i].append([ud,u,ur])

        # 设置t,确保日期循环最早从第0天开始
        t = max(0,i-6)  # 要确保t不会小于0

        out = []
        for h in range(t,i+1):
            if h not in people:
                continue
            hu = people[h]
            for kd,ku,kr in hu:
                flag = 1
                if kd<(i-6):
                    continue
                for l in range(kd,i+1):
                    if l not in place or kr not in place[l]:
                        flag = 0
                        break
                if flag:
                    out.append(ku)
        out = list(set(out))
        out.sort()
        out.insert(0,i)
        print(*out)

100分

n = int(input()) # 输入n,代表数据的天数
place = {}  # key标记日期,value标记风险地区
people = {} # key标记日期,value标记当天所有的漫游数据
for i in range(n):
    data = list(map(int,input().split())) # 输入当日收到的风险地区信息的数量、当日收到的漫游数据的条目数量,以及当日收到的风险地区的列表
    r,m = data[0],data[1]

    # 对当天收到的风险地区列表进行读取与存储
    if r!=0:
        for d in data[2:]:     
            # 遍历列表,并将该地区加入从今天起往后7天的风险地区列表
            for q in range(i,i+7):      # 7个日期都加入风险地区
                if q not in place:      # 判断是否已经有这个日期的记录
                    place[q] = set()    # 没有记录就先创建记录
                place[q].add(d)

    # 接收漫游数据,并存储到people[i]中
    if m!=0:
        for _ in range(m):
            ud,u,ur = map(int,input().split())
            if ud < 0:      # 日期<0的延迟数据,一定不存在风险地区
                continue
            if i not in people:     # 若当天还没有漫游数据,则创建一个空列表
                people[i] = []      # 现在字典中创建这一天的记录
            people[i].append([ud,u,ur]) # 存储当天的所有记录

    # 设置t,确保日期循环最早从第0天开始
    t = max(0,i-6)      # 要往前7天找记录,所以最早从第0天开始,确保t不会小于0

    # 存储输出日期及用户
    out = []            # 存储输出日期及用户
    # 提取此前7天每天用户的漫游消息
    for h in range(t,i+1): 
        if h not in people: # 如果当天没有漫游数据,就跳过
            continue
        # 用hu存储当前日期的用户漫游信息
        hu = people[h]      # hu存储当天所有漫游信息
        for kd,ku,kr in hu:  # 从漫游数据里一条提取
            if kd<(i-6):    # 若日期小于i-6,说明不在7天内,不用判断
                continue
            flag = 1
            # 判断是否持续处于奉贤区
            for l in range(kd,i+1):
                if l not in place or kr not in place[l]:
                    flag = 0
                    break
            if flag:
                out.append(ku)
    # 对要输出的数据进行去重并从小到大排序
    out = list(set(out))
    out.sort()
    # 插入日期
    out.insert(0,i)
    print(*out)

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值