python实现历届真题 作物杂交【第十一届】【省赛】【研究生组】

def dfs(u):
    #如果已经培育出来了且不是初始就有的,直接返回培育的天数
    if f[u]:return f[u]
    
    #如果len(f[u]) == 0,则说明是初始就有的种子,则直接返回0,不用处理
    L=len(s[u])
    if L==0:return 0
    
    #以上都不是,则是需要培育的种子
    f[u]=int(2e9)
    for i in range(0,L,2):#会存在两个不同的方案生成同一个编号的种子,例如42 32 14 ,4 31 14,此时s[14] = [42,32,4,31]
        f[u]=min(f[u],max(dfs(s[u][i]),dfs(s[u][i+1]))+max(t[s[u][i]-1],t[s[u][i+1]-1]))
    return f[u]
#map高阶函数介绍参考:https://blog.csdn.net/m0_37882192/article/details/115328761
n,m,k,tar=map(int,input().split())
t=list(map(int,input().split()))
s=[]
f=[]
for i in range(n+1):
    s.append([])
    f.append(0)
a=list(map(int,input().split()))

#将所有能培育C编号的种子入列表,
#表示培育方案有k种,即需要处理k行
while k:
    k-=1
    #如42 32 14 ,4 31 14,则s[C] = [A1,B1,A2,B2],即s[14] = [42,32,4,31],表示有两个方案能培育出14编号种子
    A,B,C=map(int,input().split())
    s[C].append(A)
    s[C].append(B)
print(dfs(tar))
#test 1
# 6 2 4 6
# 5 3 4 6 4 9
# 1 2
# 1 2 3
# 1 3 4
# 2 3 5
# 4 5 6

思路来源:

蓝桥杯官网 试题 PREV-230 历届真题 作物杂交【第十一届】【决赛】【研究生组】【C++】【C】【Java】【Python】四种解法_mb618d1c8a55b34的技术博客_51CTO博客

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值