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

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

网络异常,图片无法展示
|

📢📢📢📣📣📣 🌻🌻🌻Hello,大家好我叫是Dream呀,一个有趣的Python博主,多多关照😜😜😜 🏅🏅🏅CSDN 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 天,希望每天都能见到最棒的你🏅

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

网络异常,图片无法展示
|
网络异常,图片无法展示
|

目录
相关文章
|
6月前
|
Python
【Python 训练营】N_17 冒泡排序
【Python 训练营】N_17 冒泡排序
30 2
|
6月前
|
Python
【Python 训练营】N_14 文件查找和替换
【Python 训练营】N_14 文件查找和替换
32 2
|
6月前
|
Python
【Python 训练营】N_13 遍历字符串
【Python 训练营】N_13 遍历字符串
45 2
|
6月前
|
Python
【Python 训练营】N_5 斐波那契数列
【Python 训练营】N_5 斐波那契数列
35 2
|
6月前
|
Python
【Python 训练营】N_16 二分法查找
【Python 训练营】N_16 二分法查找
24 1
|
6月前
|
Python
【Python 训练营】N_15 列表元素去重
【Python 训练营】N_15 列表元素去重
37 1
|
6月前
|
Python
【Python 训练营】N_12 打印菱形图案
【Python 训练营】N_12 打印菱形图案
50 1
|
6月前
|
Python
【Python 训练营】N_11 模拟进度条
【Python 训练营】N_11 模拟进度条
24 1
|
6月前
|
Python
【Python 训练营】N_7 打印水仙花数
【Python 训练营】N_7 打印水仙花数
31 1
|
6月前
|
Python
【Python 训练营】N_18 插入排序
【Python 训练营】N_18 插入排序
27 0