拼多多算法笔试交流(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)