拼多多算法笔试交流(AC 2.6)

拼多多第三第四题好折磨人啊,都是10^12的大小,感觉需要推导出来公式才能AC,难,我只能用简单办法试试了。求一个第三第四题思路,我把我的先贴出来(第四题实在写得乱,只能A最基础的20%,就不拿出来了)

第一题 AC 100%
import sys
"""
给定N个数字,与操作次数M
M次取两个数,求最后这M个乘积的最小值
不可重复使用
测试用例:
4 2
1 2 3 4

10
"""
if __name__ == "__main__":
    # 读取第一行的n
    n, m = [int(e) for e in sys.stdin.readline().strip().split()]
    A = list(map(int, sys.stdin.readline().strip().split()))
    A.sort()
    A = A[:m*2]
    res = 0
    for i in range(m):
        res += A[i]*A[2*m-i-1]
    print(res)
第二题 AC 100%
import sys
"""
种树,给一个区间,与M个人种树的区间
每次有人种树,得到此时的树的数量
测试用例:
4 3
1 2
2 3
3 4

2
3
4
"""
if __name__ == "__main__":
    # 读取第一行的n
    n, m = [int(e) for e in sys.stdin.readline().strip().split()]
    lst = []
    for i in range(m):
        lst.append(list(map(int, sys.stdin.readline().strip().split())))

    tree = [0] * n
    count = 0
    for e in lst:
        i = e[0]-1
        while i < e[1]:
            if tree[i] != 0:
                i = tree[i]
            else:
                tree[i] = e[1]
                i+=1
                count += 1
        print(count)

第三题 AC 40%
import sys
"""
给定m,n . 最多由m个a,n个b组成一个字符串,求所有字符串中排序为K的那个字符串

超时,通过40%
"""
if __name__ == "__main__":
    # 读取第一行的n
    n, m, k = [int(e) for e in sys.stdin.readline().strip().split()]
    # print(n,m,k)
    global count
    global res
    count = 0
    if k <= n:
        print("a"*k)
        exit(0)
    # elif k<n+m:
    #     print("a"*(k-n)+"b"*(k-n))

    def rev(a_num, b_num, s, K):
        global count
        global res
        if count == K:
            res = s
            print(res)
            exit(0)
        elif count < K:
            count += 1
            if a_num>0:
                rev(a_num-1, b_num, s+"a", K)
            if b_num>0:
                rev(a_num, b_num-1, s+"b", K)

    rev(n, m, "", k)


#笔试题目##题解##拼多多#
全部评论
没参加笔试,但还是想分享一下第三题思路(逃 https://www.nowcoder.com/discuss/286676?toCommentId=4340274
点赞 回复 分享
发布于 2019-09-27 14:51

相关推荐

Noob1024:一笔传三代,人走笔还在
点赞 评论 收藏
分享
评论
2
21
分享
牛客网
牛客企业服务