解题思路:
先射击左边和先射击右边两种情况,就是2*1/n*(n-1)的概率。
解题思路:
枚举所有的评论作为最小值,按评论从大到小排序,每次遍历到的都是最小值。要想得到以该评论为最小值的最大优秀度,就要维护一个包含该评论的点赞数之和,即前i个数中取k-1个,让点赞数最大,这可以通过最小堆维护,如果当前数大于最小堆对顶则更新。
import heapq n, k = map(int, input().split()) a = list(map(int, input().split())) b = list(map(int, input().split())) c = sorted(zip(a, b), key=lambda x: -x[1]) s = 0 q = [] res = 0 for i, (ai, bi) in enumerate(c): if i < k: s += ai # 用小根堆维护最大的k个数,这样最小的数就在堆顶 heapq.heappush(q, ai) else: # 如果当前数比堆顶大,就替换堆顶 if q[0] < ai: s += ai - q[0] heapq.heappop(q) heapq.heappush(q, ai) res = max(res, s * bi) print(res)
解题思路:
对于每个笔记,时间越长,越有可能成为最多的点赞数(尽可能增加自己),存在单调性,可以用二分枚举需要增加的最小点赞数。而且给自身点赞数一定是奇数(先增加自己)。判断时通过比较增加该点赞数后整个数组点赞总数和最坏情况下整个数组点赞总数(全部一样都是最多)。
n = int(input()) a = list(map(int, input().split())) mx, s = max(a), sum(a) res = [0] * n def check(x, p): if x % 2 == 0:#偶数的时间段用不上,给自身永远是奇数,给其它的永远是偶数。 x -= 1 p += x // 2 + 1#自身增加 return s + x <= p * n#如果当前数组加上增加的数不大于最坏情况 for i in range(n): if a[i] == mx: res[i] = s elif n == 2: res[i] = -1 if a[i] < mx - 1 else 1 else: l, r = 1, 10 ** 9 while l < r: mid = (l + r) // 2 if check(mid, a[i]): r = mid else: l = mid + 1 res[i] = s + l print('\n'.join(map(str, res)))