腾讯 算法岗 10.16笔试

这笔试懂得都懂hhhh 不过正好没事,随缘参加一下,总体还是偏简单了点,全是模拟排序,就T5是一个树形DP

Q1

t = int(input())

def solve():
    x, y, k = map(int, input().split())
    def gcd(a, b):
        while a:
            a, b = b % a, a 
        return b
    res = 1
    for i in range(k + 1):
        tmp = gcd(x + i, y + k - i)
        res = max(res, tmp)
    return res

for _ in range(t):
    print(solve())

Q2

t = int(input())

def solve():
    n, m, t = input().split()
    n = int(n)
    m = int(m)
    t = float(t)
    x = list(map(float, input().split()))
    mat1 = []
    mat2 = []
    for _ in range(m):
        tmp = list(map(float, input().split()))
        mat1.append(tmp)
    for _ in range(m):
        tmp = list(map(float, input().split()))
        mat2.append(tmp)
    def matmul(a, b):
        # a 1 * n 
        # b n * m 
        res = [0] * m 
        for i in range(m):
            tmp = 0
            for j in range(n):
                tmp += a[j] * b[i][j]
            res[i] = tmp 
        return res 
    f = matmul(x, mat1)
    g = matmul(x, mat2)
    acc = 0
    for i in range(m):
        acc += (f[i] - g[i]) ** 2 
    if acc > t ** 2:
        return 1
    else:
        return 0


for _ in range(t):
    print(solve())

Q3

def solve():
    n = int(input())
    x = []
    y = []
    points = []
    for _ in range(n):
        a, b = map(int, input().split())
        x.append(a)
        y.append(b)
        points.append([a,b])

    x.sort()
    if x[n // 2] - x[n // 2 - 1] <= 1:
        return print(-1) 
    b =  x[n // 2 - 1] + 1
    l = []
    r = []
    for x1, y1 in points:
        if x1 < b:
            l.append(y1)
        else:
            r.append(y1)
    l.sort()
    r.sort()
    if l[n // 4] - l[n // 4 - 1] <= 1:
        return print(-1)
    if r[n // 4] - r[n // 4 - 1] <= 1:
        return print(-1)
    left = max(l[n // 4 - 1] + 1, r[n // 4 - 1] + 1)
    right = min(l[n // 4] - 1, r[n // 4] -1)
    if left > right:
        return print(-1)
    return print(right, b)
solve()

Q4

n = int(input())
def solve():
    loc = []
    speed = []
    for _ in range(n):
        x, v = map(int, input().split())
        loc.append(x)
        speed.append(v)
    loc.sort()
    speed = [[s, i] for i, s in enumerate(speed)]
    speed.sort()
    res = [[-1,-1] for _ in range(n)]
    for i in range(n):
        res[speed[i][-1]] = [loc[i], speed[i][0]]

    for a, b in res:
        print(a, b)
        
solve()

Q5

思路:树形dp,自底向上,到当前节点p的时候 需要考虑是否有两个子节点相加最大,往上传的参数为p的权重与子节点加路径的最大值,详情见代码

def solve():
    n = int(input())
    *weights, = map(int, input().split())
    from collections import defaultdict
    g = defaultdict(list)
    for _ in range(n - 1):
        x, y, d = map(int, input().split())
        g[x - 1].append((y - 1, d))
        g[y - 1].append((x - 1, d))
    res = 0
    def dfs(node, fa):
        nonlocal res
        first = -1
        second = -1
        for new, d in g[node]:
            if new == fa:
                continue 
            tmp = dfs(new, node) + d 
            if tmp > first:
                second = first 
                first = tmp 
            elif tmp > second:
                second = tmp 
        if first == -1:
            res = max(res, weights[node])
            return weights[node]
        # 两个节点
        if second != -1:
            res = max(res, first + second)
        # 当前node节点
        res = max(res, weights[node] + first)
		# 最后的节点可能就到node,所以要取max
        return max(first, weights[node])
    dfs(0,-1)
    return res
print(solve())

#腾讯笔试##秋招笔试##秋招#
全部评论
第一题 忘记了gcd 用普通的就公约数,直接超时 hhhh
1 回复 分享
发布于 2022-10-16 22:27 重庆
我的题和你的好像不一样
点赞 回复 分享
发布于 2022-10-16 22:06 北京
请问你第五题AC了吗? 我感觉自己没问题,但就是0%。。。
点赞 回复 分享
发布于 2022-10-16 22:08 江苏
居然是树形dp。我还疑惑我都整成o(n2)都过不了一个样例。 还有1,3思路和代码几乎一样但是怎么就不能ac呢。。。
点赞 回复 分享
发布于 2022-10-16 22:09 广东
第五题写了个dij算法求最短路径,时间复杂度为ON^2,样例过了但通过率为0%
点赞 回复 分享
发布于 2022-10-16 22:15 福建

相关推荐

11-02 09:49
已编辑
货拉拉_测试(实习员工)
热爱生活的仰泳鲈鱼求你们别卷了:没事楼主,有反转查看图片
点赞 评论 收藏
分享
点赞 评论 收藏
分享
6 13 评论
分享
牛客网
牛客企业服务