【Python训练营】Python每日一练----第3天:作物杂交

是Dream呀 发表于 2022/01/20 15:47:57 2022/01/20
【摘要】 【Python训练营】Python每日一练----第3天:作物杂交

在这里插入图片描述

📢📢📢📣📣📣
🌻🌻🌻Hello,大家好我叫是Dream呀,一个有趣的Python博主,多多关照😜😜😜
🏅🏅🏅Python领域优质创作者,大二在读,欢迎大家找我合作学习(文末有VX 想进学习交流群or学习资料 欢迎+++)
💕入门须知:这片乐园从不缺乏天才,努力才是你的最终入场券!🚀🚀🚀
💓最后,愿我们都能在看不到的地方闪闪发光,一起加油进步🍺🍺🍺
🍉🍉🍉“一万次悲伤,依然会有Dream,我一直在最温暖的地方等你”,唱的就是我!哈哈哈~🌈🌈🌈
🌟🌟🌟✨✨✨

前言:【Python训练营】是针对Python语言学习所打造的一场刷题狂欢party! 对基础知识把握不牢固的话,欢迎参考此套课程:Python公开课 搭配使用最佳嗷~喜欢的话就抓紧订阅起来吧!🍋🍋🍋如果对学习没有自制力或者没有一起学习交流的动力,欢迎私信或者在文末添加我的VX,我会拉你进学习交流群,我们一起交流学习,报团打卡

@TOC

真题描述

题目描述
在这里插入图片描述
输入描述
在这里插入图片描述

输出描述
输出一个整数,表示得到目标种子的最短杂交时间。

输入输出样例
示例
输入

6 2 4 6
5 3 4 6 4 9
1 2
1 2 3
1 3 4
2 3 5
4 5 6
# 输出

16

样例说明

第 1 天至第 5 天,将编号 1 与编号 2 的作物杂交,得到编号 3 的作物种子。

第 6 天至第 10 天,将编号 1 与编号 3 的作物杂交,得到编号 4 的作物种子。

第 6 天至第 9 天,将编号 2 与编号 3 的作物杂交,得到编号 5 的作物种子。

第 11 天至第 16 天,将编号 4 与编号 5 的作物杂交,得到编号 6 的作物种子。

总共花费 16 天。

运行限制
最大运行时间:2s
最大运行内存: 256M

解题思路

  • 挨着来说,首先注意输入要求,第一行要包括四个数据,我们可以用map()函数来实现input()批量输入
  • 然后第二行,第三行的输入要为以后找最短天数提供数据,我们将其用列表的方式存储,便于后续使用
  • 然后定义搜索函数dfs(),其中的参数T便是我们要求的目标作物,当目标作物在已知的have中时,此时需要的时间就是0;
  • 当其不在其中时,我们就在杂交方式ways中找到目标作物T,此时的ways中的元素中的小列表中的第三个元素便是我们的T,顺势我们将此小列表中得到T的那两个元素也在times中找到,看看他们所需要的时间,取他们其中的最大值tmp = max(times[i[0]-1], times[i[1]]-1)
  • 紧接着采用递归的方式看看其余的这两个元素是否在已知的have中存在,若存在则时间是0,不存在则时间采用同种方式继续求得,此时的time便为min_t =max(dfs(i[0]), dfs(i[1])) + tmp
  • 如果在have或者ways中没有我们所要的目标元素,那需要的时间就还是无限的,因此在开始时我们要把时间time定义为无限大,当只有在have或者ways中找到我们要得到的元素时,我们在能进一步得到一个具体的时间min_t ,此时让time = min_t,最后函数结束return 我们的time

源码分享

import math
N, M, K, T = map(int, input().split())
times = list(map(int, input().split()))
have = list(map(int, input().split()))
ways = []
for i in range(K):
    ways.append(list(map(int, input().split())))
# 定义dfs函数搜索情况,参数T是目标种子
def dfs(T):
    # 出口
    if T in have:
        return 0
    # 寻找目标种子
    time = math.inf
    for i in ways:
        if i[2] == T:
            tmp = max(times[i[0]-1], times[i[1]]-1)
            min_t = max(dfs(i[0]), dfs(i[1])) + tmp
            time = min_t
    return time
print(dfs(T))

学习总结

1.input() 接收多个用户输入需要与split()结合使用

host, port, username, passwd, dbname = input("请输入服务器地址,端口号,用户名,密码及数据库名,空格隔开:").split()   
# 注意input()的返回类型是str
print(host,port,username,passwd,dbname)
# 请输入服务器地址,端口号,用户名,密码及数据库名,空格隔开:10.1.1.71 22 root 123456 db_name
# 10.1.1.71 22 root 123456 db_name

注意返回的数据类型是str,如果是整数需要转化为int才可正常使用
map()用法

map(function, iterable,)
function – 函数
iterable – 一个或多个序列

返回值:
Python 2.x 返回列表。
Python 3.x 返回迭代器。
所以Python 3.x要加list()函数将迭代器转化为列表

N, M, K, T = map(int, input().split())
times = list(map(int, input().split()))

2.math.inf表示正无穷大,负无穷大为-math.inf

  • math.pi 圆周率pi
  • math.e 自然常数e
  • math.factorial(x) 返回x的阶乘如果x是小数或复数,返回ValueError
  • math.fabs(x) 返回x的绝对值
  • math.ceil(x) 向上取整,返回不小于x的最小整数
 >>> ceil(4.2)
5
  • math.floor(x) 向下取整,返回不大于x的最大整数
>>> floor(4.2)
4

🏅今天是我在Python训练营的第 3 天,希望每天都能见到最棒的你🏅

🌲🌲🌲 好啦,这就是今天要分享给大家的全部内容了
❤️❤️❤️如果你喜欢的话,就不要吝惜你的一键三连了~
在这里插入图片描述
在这里插入图片描述

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区),文章链接,文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件至:cloudbbs@huaweicloud.com进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容。
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。