反思
考试的时候看见这个题第一反应去想拓扑排序了,一紧张没弄清楚最晚时间的规律。。。
其实这个也用不到拓扑排序,题目给简化了。
主要理解最晚时间的计算,倒着计算比较好入手,关键就是理解题意的问题
需要注意的是后面可能有很多个项依赖这个项,所以要求最小值,不能找到依赖的关系之后就直接减
代码
n,m = map(int,input().split())
# n天,m个任务
rely =[0] + list(map(int,input().split()))
days =[0] + list(map(int,input().split()))
flag = 1
earest_day = [0] * (m+1)
for i in range(1,m+1):
if rely[i] == 0:
earest_day[i] = 1
else:
earest_day[i] = earest_day[rely[i]]+days[rely[i]]
if earest_day[i]+days[i]-1 > n:
flag = 0
# break
print(*earest_day[1:])
latest_day = [n-i+1 for i in days]
if flag == 0:
exit(0)
for i in range(m,0,-1):
if rely[i] == 0:
continue
for j in range(0,i):
if rely[i] == j:
latest_day[j] = min(latest_day[i]-days[j],latest_day[j])
print(*latest_day[1:])
上面求最晚时间时,内层循环是从前往后遍历,即当下外层循环i时不求i,而是用确定好当前的i,看前面有没有i依赖的项,再去修改前面i依赖的项j
也可以遍历的是i就求i,这个时候就是确定好i,然后看看后面有没有依赖i的,要是有依赖i的就更新i的最晚时间
n,m = map(int,input().split())
rely =[0] + list(map(int,input().split()))
need_day =[0] + list(map(int,input().split()))
early_day = [0]*(m+1)
end_time = 0
for i in range(1,m+1):
if rely[i] == 0:
early_day[i] = 1
# continue
early_day[i] += early_day[rely[i]]+need_day[rely[i]]
end_time = max(end_time,early_day[i]+need_day[i])
print(*early_day[1:])
if end_time>n+1:
exit(0)
latest_day = [0]*(m+1)
for i in range(m,0,-1):
latest_day[i] = n-need_day[i]+1
for j in range(i+1,m+1):
if rely[j] == i:
latest_day[i] = min(latest_day[j]-need_day[i],latest_day[i])
print(*latest_day[1:])