用python 第一行两个数n,m表示有n个技能和m个技能点。第二行有n个数,第i个数表示第i个技能的威力值。 之后的n-1行,每行两个数x,y,表示y技能的前提技能是x,也就是说先学第x个技能才能学弟y个技能。
时间: 2024-06-06 09:06:57 浏览: 12
以下是代码实现:
n, m = map(int, input().split()) # 输入n和m
power = list(map(int, input().split())) # 输入每个技能的威力值
pre_req = [[] for _ in range(n)] # 初始化前提技能列表
for i in range(n-1): # 输入前提技能
x, y = map(int, input().split())
pre_req[y-1].append(x-1)
# 计算每个技能的总威力值
total_power = [0]*n
def dfs(node):
if total_power[node] != 0: # 如果已经计算过该节点的总威力值,直接返回
return total_power[node]
else:
p = power[node] # 当前节点的威力值
for pre_node in pre_req[node]: # 遍历前提技能
p += dfs(pre_node) # 将前提技能的总威力值累加到当前节点的总威力值中
total_power[node] = p # 将当前节点的总威力值存入列表
return p
for i in range(n): # 遍历每个节点
dfs(i)
# 输出最大总威力值
print(max(total_power))
相关问题
输入两个三位数m和n,输出m和n之间的水仙花数 python
好的,您的要求已经被记录下来了。关于您的问题,以下是一个示例的Python代码实现:
```python
m = int(input("请输入第一个三位数:"))
n = int(input("请输入第二个三位数:"))
if m > n:
m, n = n, m
for num in range(m, n+1):
temp = num
sum = 0
while temp > 0:
digit = temp % 10
sum += digit ** 3
temp //= 10
if num == sum:
print(num)
```
这段代码首先要求输入两个三位数m和n,然后通过一个if语句将它们排序(确保后面的循环仅在m到n范围内执行)。接下来,将num变量设置为m到n范围内的每个数,并使用while循环计算每个数字的立方和。最后,如果该数字与它的立方和相等,则被判定为水仙花数,并输出到控制台。希望这个代码对您有帮助!
用python写编写函数输入两个数m和n,分别输出这两个数的最大公约数和最小公倍数
可以使用辗转相除法求最大公约数,公式为:
gcd(m,n) = gcd(n, m%n)
最小公倍数可以用最大公约数求得,公式为:
lcm(m,n) = m * n / gcd(m,n)
下面是对应的 Python 代码实现:
```python
def gcd(m, n):
if n == 0:
return m
else:
return gcd(n, m % n)
def lcm(m, n):
return m * n // gcd(m, n)
m = int(input("请输入第一个数:"))
n = int(input("请输入第二个数:"))
print("最大公约数为:", gcd(m, n))
print("最小公倍数为:", lcm(m, n))
```