HULU 2019/9/5 算法笔试题目

第一题 AC 88%
def lastRemaining(n, m):
    if n == 1: return 0
    return (lastRemaining(n-1, m) + m) % n

if __name__ == "__main__":
    n, m = [int(x) for x in input().strip().split(' ')]
    a = [int(x) for x in input().strip().split(' ')]
    w = [int(x) for x in input().strip().split(' ')]
    tol = sum(w)
    num = lastRemaining(n, m)
    pro = 0
    for i in range(len(a)):
        if a[num] == 1:
            pro += w[i]/tol
        num = (num + 1) % n
    print("%.5f"%pro)
第二题 AC 100%
def solve(A):
    MOD = 10**9 + 7

    stack = []
    ans = dot = 0
    for j, y in enumerate(A):
        count = 1
        while stack and stack[-1][0] <= y:
            x, c = stack.pop()
            count += c
            dot -= x * c

        stack.append((y, count))
        dot += y * count
        ans += dot
    return ans % MOD
if __name__ == '__main__':
    n = int(input())
    nums = list(map(int,input().strip().split(' ')))
    print(solve(nums))
第三题  AC  36%  用的动态规划,一直没明白 为什么通不过所有样例,内存优化了,而且也没有超时
if __name__ == "__main__":
    n = int(input())
    net = [0]*n
    for i in range(n):
        t = [int(x) for x in input().strip().split(' ')]
        if i == 0:
            for j in range(1, n):
                net[j] = net[j-1] + t[j]
            continue
        for j in range(n):
            if j == 0:
                net[j] = net[j] + t[j]
                continue
            net[j] = min(net[j-1], net[j]) + t[j]

    print(net[n-1])
第四题   放弃
相求 大佬指点下  第一题和 第三题  为啥 没有 AC 100%


#hulu##笔试题目##算法工程师#
全部评论
第四题贴个代码,做法没问题,python没有gc所以一直内存超限。。优化了很久把dp的dict改成反复清空的一维list还是不行,十分郁闷。。 其实思路跟leetcode813.最大平均值和的分组差不多,就是把平均数换成了类别数 import sys def largestScore(A: list, K: int) -> float: n = len(A) count = {} # 先计算各个段的场次数方便后面调用 for i in range(n): now = {A[i]} count[i, i+1] = 1 for j in range(i+1, n): now.add(A[j]) count[i, j+1] = len(now) dp = {(1, i): count[0, i] for i in range(1, n+1)} # dp[k, i] 前i个数分成k组的最大分数 for i in range(2, n+1): for j in range(i, n+1): _max = dp[i-1, j-1] + 1 for k in range(i-1, j-1): _max = max(_max, dp[i-1, k] + count[k, j]) dp[i, j] = _max return dp[K, n] _, K = map(int, sys.stdin.readline().strip().split(' ')) A = list(map(int, sys.stdin.readline().strip().split(' '))) print(largestScore(A, K))
1 回复 分享
发布于 2019-09-06 21:36
第一题 概率的精度问题
点赞 回复 分享
发布于 2019-09-06 09:44
第三题只考虑两个方向
点赞 回复 分享
发布于 2019-09-05 22:59

相关推荐

牛客刘北:如果暑期实习是27届的话,你要晚一年才会毕业,企业为什么会等你呢?要搞清时间逻辑呀!27届现在实习只能是在暑假实习,这是日常实习,不是暑期实习。所以多去投日常实习吧,暑期实习肯定不会要你的
点赞 评论 收藏
分享
不愿透露姓名的神秘牛友
06-24 20:25
腾讯今年实习招了这么多人,后面秋招还会招人吗??想着秋招再战来着
牛客965593684号:腾讯好像2020年之后就是实习生招得多,应届生基本上不招,纯实习转正
点赞 评论 收藏
分享
评论
6
51
分享

创作者周榜

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