题目
题目较长,请查看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)