美团8.13 463/500 后端
属实不配AK
第一题
""" AC 送餐: 送餐小哥有个魔法可以将餐立即送到客户面前 问: 最少需要使用多少次魔法可以在截止时间内将餐送到客户面前 输入参数 n , t : 送餐数量, 每次送餐需要的时间 arr : 每次送餐的截止时间 输入样例1 6 5: 数量 5 6 7 8 9 10 输出样例2 4 输入样例2 6 5 100 101 102 103 104 105 输出样例2 0 """ n, t = list(map(int, input().split())) arr = list(map(int, input().split())) arr.sort() end_time = t ans = n for i in arr: if end_time <= i: end_time = end_time + t ans -= 1 print(ans)第二题
""" AC 有一个扫地机器人 W A S D 命令控制其移动方向 每次移动一步 房间为 n * m 的矩形 n行 m列 机器人默认在最左上角, 并且所在格子已清洗 输入参数 n : 命令数 WASDS : 输入的命令 输出参数1: "Yes" : 表结果 s : 清洗整个房间所需要的最小步数 输出参数2: "No" : 表结果 s : 房间内剩余未走到的区块数量 """ def solution(): m, n, op_num = list(map(int, input().split())) op = list(input()) arr = [[False for _ in range(m)] for __ in range(n)] arr[0][0] = True sum_ = n * m cur = [0, 0] temp = 1 for i in range(len(op)): if op[i] == "W": if cur[0] > 0: cur[0] -= 1 if not arr[cur[0]][cur[1]]: temp += 1 arr[cur[0]][cur[1]] = True elif op[i] == "S": if cur[0] < n: cur[0] += 1 if not arr[cur[0]][cur[1]]: temp += 1 arr[cur[0]][cur[1]] = True elif op[i] == "A": if cur[1] > 0: cur[1] -= 1 if not arr[cur[0]][cur[1]]: temp += 1 arr[cur[0]][cur[1]] = True else: if cur[1] < m: cur[1] += 1 if not arr[cur[0]][cur[1]]: temp += 1 arr[cur[0]][cur[1]] = True if temp == sum_: print("Yes") print(i + 1) return print("No") print(sum_ - temp) solution()第三题
""" AC 游戏规则 有n 张牌 序号为 1-n A 拿一个牌堆最上面的牌 放到最后面 B 拿一个牌堆最上面的牌 放到最后面' 两人同时公开当前牌堆上最上面的那个牌 输入参数 n 1 2 3 4 : 依次掀开的牌顺序 输出参数 4 2 1 3 : 原始牌顺序(从牌顶到牌底) """ n = int(input()) arr = list(map(int, input().split())) ans = ['' for _ in range(n)] n = n cur = 2 ans[cur] = f'{arr.pop(0)}' for i in arr: step = 3 while step: cur = (cur + 1) % n if not ans[cur]: step -= 1 ans[cur] = f'{i}' print(" ".join(ans))第四题 (只想到了暴力解 ┭┮﹏┭┮))
""" 63/100 一个数列, a[0], a[1], ..., a[n] i < j < k 求得该数列有多少个子数列满足 a[i] - a[j] == 2 * a[j] - a[k] 输入参数: n : 数列长度 arr : 数列 输入例子 4 4 2 2 2 """ n = int(input()) a = list(map(int, input().split())) def solution_1(n, arr): ans = 0 for i in range(n): for j in range(i + 1, n): for k in range(j + 1, n): ans += 1 if arr[i] - arr[j] == 2 * arr[j] - arr[k] else 0 print(ans) solution_1(n, a)第五题
""" AC 一个二叉树 用数组表示 做儿子为 2 * k 右儿子为 2 * k + 1 每个节点有个值 求得从根节点到最后得到的值总和最大为多少 """ n = int(input()) a = list(map(int, input().split())) a.insert(0, 0) ans = [0 for _ in range(n + 1)] ans[1] = a[1] for i in range(2, n + 1): ans[i] = a[i] + ans[i // 2] print(max(ans))