滴滴笔试AK(9月28日)

T1

n, a, b, c = map(int, input() .split())
cache = dict()

def dfs(i, a ,b, g):
    if (i,a, b,c) in cache:
        return 0
    ans = int(a + b > c and a + c > b and b + c > a)
    if n < i:
        cache[(i,a,b,c)] = ans
        return ans
    if c > i:
        ans += dfs(i + 1,a, b, c - i)
    if b > i:
        ans += dfs(i + 1,a, b - i, c)
    if a > i:
        ans += dfs(i + 1,a - i, b, c)
    cache[(i, a,b,c)] = ans

    return ans

print(dfs(1,a, b, c))

T2 换根dp,先dfs一次算出根为0时候的答案,记录一下每个节点的子树的大小,然后换根,计算的时候可以O(1)转移根节点

def dfs1(root):
    sz = 1
    for to in adj[root]:
        if vis[to]:
            continue
        vis[to] = 1
        sz2, ans2 = dfs1(to)
        sz += sz2
        ans[root] += ans2
    ans[root] += sz - 1
    szv[root] = sz
    return sz, ans[root]

def dfs2(root):
    for to in adj[root]:
        if vis[to]:
            continue
        vis[to] = 1
        t = ans[to]
        ans[to] += n - szv[to]
        ans[to] += ans[root] - t - szv[to]
        dfs2(to)

n, m = map(int, input().split())
adj = [[] for _ in range(n)]
p = [-1] * n
szv = [0] * n
ans = [0] * n

xv = list(map(int,input().split()))
for i in range(1, n):
    x = xv[i-1]-1
    p[i] = x
    adj[i].append(x)
    adj[x].append(i)

vis = [0] * n
vis[0] = 1
dfs1(0)

vis = [0] * n
vis[0] = 1
dfs2(0)

xv = list(map(int,input().split()))
for i in range(m):
    v = xv[i] - 1
    print(ans[v], end=" ")

#滴滴##笔试#
全部评论
依依神,太强了
点赞 回复 分享
发布于 2023-09-29 22:03 浙江
@青笛
点赞 回复 分享
发布于 2023-09-28 23:43 湖南
楼主,T1代码跑n, a, b, c = 1,100,100,100答案应该是4吧?你的答案是2.根据示例5,3,4,5的结果为10,顺序不同的原木组合应该算两种。
点赞 回复 分享
发布于 2023-09-28 23:37 江苏

相关推荐

09-29 12:24
门头沟学院 Java
点赞 评论 收藏
分享
08-08 16:33
唐山学院 Java
职场水母:首先,简历太长,对于实习和应届找工作,hr一眼扫的是学历,技术看实习,你写的技术栈字太多了,尽量用一句话概括不用写那么详细,技术面的时候会问的,而且技术栈都会在实习或者项目里体现,你要做的是,把你的简历浓缩为一页,删除没用的东西,比如实践经历,自我评价,这些纯废话,没用,专业技能写的太离谱,你真的熟练掌握了吗,建议都写熟悉,找工作和写论文不一样,追求的是干练和实用,把实习经历和项目提前,把掌握的技术栈写到最后,然后去找实习,
点赞 评论 收藏
分享
牛客40297450...:不是研究生强,是你强
点赞 评论 收藏
分享
评论
3
3
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务