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-05 22:59
第一题 概率的精度问题
点赞 回复 分享
发布于 2019-09-06 09:44

相关推荐

贺兰星辰:不要漏个人信息,除了简历模板不太好以外你这个个人简介是不是太夸大了...
点赞 评论 收藏
分享
评论
6
51
分享
牛客网
牛客企业服务