米哈游笔试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))]))

个人认为整体难度很白给,没有任何难度算法和数据结构,比暑期实习的题简单多了

全部评论
T2 无向图意思是他给的数据可能不是按父 子的顺序给的?这也太坑了
1 回复 分享
发布于 2023-08-13 22:11 重庆
请问第三题13行wai的是不是没复制出来?
点赞 回复 分享
发布于 2023-08-13 22:09 加拿大
第一题第7行应该是return min(abs(a-b), abs(min(a, b)+l - max(a, b)))哈
点赞 回复 分享
发布于 2023-08-13 22:19 上海

相关推荐

牛客279957775号:铁暗恋
点赞 评论 收藏
分享
9 22 评论
分享
牛客网
牛客企业服务