腾讯技术与数据分析笔试AC两题代码(第四题超内存)

第一题是园丁修理栏杆问题,滑动窗口法
def get_idx(n, k, nums):
    if k == n:
        return 1
    idx = 0
    min_res = sum(nums[:k])
    res = min_res
    for i in range(n-k):
        res = res - nums[i] + nums[i+k]
        if res < min_res:
            idx = i
            min_res = res
    return idx+2

import sys
line1 = sys.stdin.readline().strip().split()
line2 = sys.stdin.readline().strip().split()
n, k = int(line1[0]), int(line1[1])
nums = [int(i) for i in line2]
print(get_idx(n, k, nums))
第二题不理解,除了角落里的有可能不碎,它测试用例第二个为啥不碎?我走到那里退出来再走一次不就好了?
第三条做冰淇淋问题,不知道叫啥,贪心?
import sys

line = sys.stdin.readline().strip().split()
line1 = sys.stdin.readline().strip().split()
line2 = sys.stdin.readline().strip().split()
n, m = int(line[0]), int(line[1])
weight = [int(i) for i in line1]
value = [int(i) for i in line2]
idxs = sorted(range(n), key=lambda x:weight[x])
w1 = [weight[i] for i in idxs]
v1 = [value[i] for i in idxs]
res = w1[0]
s = v1[0]
for i in range(1, n):
    #print(m, s, res)
    if m >= (w1[i] - w1[i-1]) * s:
        m -= (w1[i] - w1[i - 1]) * s
        s += v1[i]
        res = w1[i]
        #print((w1[i] - w1[i-1]) * s)
    else:
        res += m // s
        m = 0
        break
if m > 0:
    res += m // s
print(res)
这个题一开始没加那个break,正确90%,我宁愿不做后面的题也想AC,强迫症吧。
第四题,飞机航线问题,这个题弗洛伊德方法,但是我试了一下,读入数据之后就超内存了。。。也不知道对不对,我个人觉得是正确的
import sys
line = sys.stdin.readline().strip().split()
n, m, q = int(line[0]), int(line[1]), int(line[2])
max_num = 10**10
nums = [[max_num] * n for i in range(n)]
for i in range(n):
    nums[i][i] = 0
for _ in range(m):
    line = sys.stdin.readline().strip().split()
    u, v, w = int(line[0]), int(line[1]), int(line[2])
    nums[u-1][v-1] = min(w, nums[u-1][v-1])
dist = nums[0]
for i in range(n):
    for j in range(n):
        for k in range(n):
            if nums[i][j] + nums[j][k] < nums[i][k]:
                nums[i][k] = nums[i][j] + nums[j][k]
#print(nums)
for i in range(q):
    line = sys.stdin.readline().strip().split()
    s, l, r, p = int(line[0]), int(line[1]), int(line[2]), int(line[3])
    for j in range(l, r+1):
        if nums[0][n-1] > nums[0][s-1] + p + nums[j-1][n-1]:
            nums[0][n-1] = nums[0][s-1] + p + nums[j-1][n-1]
    print(nums[0][n-1])
第五题密室最大分数问题,没啥思路,也没时间了。等大佬教教我


#腾讯##笔试题目#
全部评论
有大佬说第四题只能用邻接表,这个是真没想到。毕竟习惯性二维数组了
点赞 回复
分享
发布于 2019-08-17 22:19
第二题我也觉得样例2是错的   我也是0分
点赞 回复
分享
发布于 2019-08-17 22:21
联想
校招火热招聘中
官网直投

相关推荐

2 33 评论
分享
牛客网
牛客企业服务