米哈游笔试8.13后端题解
欢迎点赞交流讨论
T1
先后经过三个点,求最短距离;平面可连接扩展。
模拟即可,参考代码:
m, n = list(map(int, input().split()))
x1, y1 = list(map(int, input().split()))
x2, y2 = list(map(int, input().split()))
x3, y3 = list(map(int, input().split()))
def f(a, b, l):
return min(abs(a-b), abs(min(a, b)+l - max(a, b)))
print(f(x1, x2, m)+f(y1, y2, n)+f(x2, x3, m)+f(y2, y3, n))
T2
向有根树的叶添加节点,使得距离根一定范围内的节点数最大。
只需要关心叶节点和它的深度即可,注意是无向图,不要被例题图片迷惑了,参考代码:
# Python默认的最大递归深度是1000,小于本题的范围,要设置下
import sys
sys.setrecursionlimit(1000000000)
n, k = list(map(int, input().split()))
G = [[] for i in range(n)]
for _ in range(n-1):
u, v = list(map(int, input().split()))
G[u-1].append(v-1)
G[v-1].append(u-1)
def dfs(cur, depth, parent):
if depth>k:
return 0
ans = 1
if len(G[cur])>1 or parent==-1:
for child in G[cur]:
if child!=parent:
ans += dfs(child, depth+1, cur)
else:
ans += max(0, k-depth)
return ans
print(dfs(0, 0, -1))
T3
抽卡题,规则不再赘述,玩过原的应该会熟悉些。跟实际游戏还是有点区别的,实际上89抽之前也会增大抽取概率,本题留了一手。
数据范围很小,维护一个第i抽出金的概率数组,二层循环模拟即可,最后期望就是抽数乘以概率的累加和。参考代码:
p = float(input())
tmp = [0]*181
def wai(cur, index):
for i in range(1, 90):
tmp[index+i] += cur*p
cur = cur*(1-p)
tmp[index+90]+= cur
cur = 1
for i in range(1, 90):
tmp[i] += cur*p/2
wai(cur*p/2, i)
cur = cur*(1-p)
tmp[90] += cur/2
wai(cur/2, 90)
print(sum([i*tmp[i] for i in range(len(tmp))]))
个人认为整体难度很白给,没有任何难度算法和数据结构,比暑期实习的题简单多了
小天才公司福利 1176人发布
查看25道真题和解析
