腾讯技术与数据分析笔试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])第五题密室最大分数问题,没啥思路,也没时间了。等大佬教教我