[python与CSP的姻缘]202212-2 训练计划

反思

考试的时候看见这个题第一反应去想拓扑排序了,一紧张没弄清楚最晚时间的规律。。。
其实这个也用不到拓扑排序,题目给简化了。
主要理解最晚时间的计算,倒着计算比较好入手,关键就是理解题意的问题
需要注意的是后面可能有很多个项依赖这个项,所以要求最小值,不能找到依赖的关系之后就直接减

代码

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

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值