📜  门|门 IT 2008 |第 45 题(1)

📅  最后修改于: 2023-12-03 15:42:22.129000             🧑  作者: Mango

门|门 IT 2008 |第 45 题

题目描述

有一个包含 n 个元素的序列 nums,每个元素都是一个非负整数。现在你需要进行 m 次操作,每次操作可以选择一个下标 i 并将 nums[i] 的值加一。请你计算出进行这 m 次操作后,整个序列中有多少个元素的值不小于 k。

请你编写一个函数 solve(nums: List[int], m: int, k: int) -> int,来解决这个问题。

输入格式
  • nums: 包含 n 个非负整数的序列,数值均小于等于 10^5。
  • m: 操作次数。
  • k: 阀值。
输出格式
  • 返回值:整个序列中有多少个元素的值不小于 k。
示例

输入:

nums = [2, 3, 4, 5, 7]
m = 10
k = 5

输出:

7

解释:

进行 10 次操作后,序列变成了 [12, 13, 14, 15, 17],其中有 7 个元素的值不小于 5。

思路
  • 先将 nums 按照从小到大排序。
  • 遍历 nums,每次计算出当前元素 i 还需要增加多少次才能达到 k。
  • 假设当前元素为 nums[j],那么当前元素还需要增加的次数为:k-nums[j]。
  • 如果 m 次操作大于当前元素还需要增加的次数,则将当前元素增加到 k 并将剩余的操作次数 m 减去当前元素还需要增加的次数。
  • 否则停止操作,返回当前 j 之后的元素个数(因为之后的元素都比当前元素小,不可能再达到 k)。
代码实现
from typing import List

def solve(nums: List[int], m: int, k: int) -> int:
    nums.sort()
    n = len(nums)
    j = 0
    
    for i in range(n):
        add_num = k - nums[i]
        
        if m > add_num:
            m -= add_num
            nums[i] += add_num
        else:
            break
    
    while j < n and nums[j] < k:
        j += 1
    
    return n - j

该函数接收三个参数: nums表示序列,m表示操作次数,k表示阀值。该函数返回值为整个序列中有多少个元素的值不小于 k。