import sys from typing import List inputs = [] for line in sys.stdin: inputs.extend(map(int, line.split())) def takeSecond(elem): return elem[1] def max_values(nums: List[int]) -> int: max_values = 0 n, m = nums[0], nums[1] a = sorted(nums[2:2 + n]) bc = sorted([[nums[i], nums[i+1]] for i in range(2 + n, 2 + n + 2 * m, 2)], key=takeSecond, reverse=True) for item in bc: if not a: break if item[0] > a[-1]: continue # 使用二分查找找到合适的位置 from bisect import bisect_left position = bisect_left(a, item[0]) max_values += item[1] a.pop(position) # 注意:这里会改变数组a的顺序,可以考虑其他方法避免修改a return max_values print(max_values(inputs))
第一步:将m批次客人按照金额降序进行排列
第二步,先安排符合单桌最大人数要求的客人中金额较大批次,不符合直接无法安排,换一批客人
第三步,记录被安排的桌次,直到所有桌次被占满(break执行),或者批次已被安排完成(for循环自己结束)