作物杂交&&裁纸刀

题目

作物杂交是作物栽培中重要的一步。已知有 N 种作物 (编号 1 至 N ),第 i 种作物从播种到成熟的时间为 Ti​。作物之间两两可以进行杂交,杂交时间取两种中时间较长的一方。如作物 A 种植时间为 5 天,作物 B 种植时间为 7 天,则 AB 杂交花费的时间为 7 天。作物杂交会产生固定的作物,新产生的作物仍然属于 N 种作物中的一种。

初始时,拥有其中 M 种作物的种子 (数量无限,可以支持多次杂交)。同时可以进行多个杂交过程。求问对于给定的目标种子,最少需要多少天能够得到。

如存在 4 种作物 ABCD,各自的成熟时间为 5 天、7 天、3 天、8 天。初始拥有 AB 两种作物的种子,目标种子为 D,已知杂交情况为 A × B → C,A × C → D。则最短的杂交过程为:

第 1 天到第 7 天 (作物 B 的时间),A × B → C。

第 8 天到第 12 天 (作物 A 的时间),A × C → D。

花费 12 天得到作物 D 的种子。

思路

看题目给出的示例,一脸懵,觉得这个还要双线程进行杂交,好复杂。就去看了别人的解析,发现主要思想就是利用动态规划的思想,从目标作物进行递归。

代码

import os
import sys

N, M, K, T = map(int, input().split())
T2 = list(map(int, input().split())) # 作物生长时间
have = list(map(int, input().split())) # 已有种子
st = [False] * (N+1)
cross = [[] for _ in range(N+1)] # 存储杂交规则 a+b->c cross[c] 存储(a, b)
g = [10000000] * (N+1) # 得到作物所需时间

for i in have: # 初始化已有种子的状态
  st[i] = True
  g[i] = 0

for _ in range(K): # 记录每条杂交规则
  a, b, c = map(int, input().split())
  cross[c].append((a, b))


def dfs(u): # 动态规划思想
  if st[u]:
    return g[u]
  for a, b in cross[u]: # 杂交规则一遍遍递归
    g[u] = min(g[u], max(dfs(a), dfs(b)) + max(T2[a-1], T2[b-1]))
  
  st[u] = True
  return g[u]

dfs(T)
print(g[T])

问题 

小蓝有一个裁纸刀,每次可以将一张纸沿一条直线裁成两半。

小蓝用一张纸打印出两行三列共 6 个二维码,至少使用九次裁出来,下图给出了一种裁法。

思路

数学题,提炼出规律。n行m列 需要裁: (n-1) + n*(m-1) + 4 

 代码

import os
import sys

# 请在此输入您的代码
print(19+20*21+4)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值