优秀项目组初选评比 | 豆包MarsCode AI刷题

145 阅读4分钟

优秀项目组初选评比(优秀项目组初选评比 - MarsCode)

公司正在进行优秀项目组评比的初选工作,参赛者有小C、小U、小R、小S、小M和小F的项目组。评委会已经根据他们提交的材料完成了打分,各个项目组的得分分别是s1,s2,s3,,sks1,s2,s3,…,sk。评委们希望设定一个初选晋级的分数线xx,让所有得分大于xx的项目组晋级,其他的项目组将被淘汰。此外,评委们希望晋级的项目组数量和淘汰的项目组数量都在区间[m,n][m,n]之间。

显然,这个分数线xx可能不存在,也可能存在多个满足条件的分数线。如果不存在满足条件的xx,则输出1−1;如果存在多个满足条件的分数线xx,则输出满足条件的最小分数线。

测试样例

示例 1:

输入:m = 2, n = 3, a = [1, 2, 3, 5, 6, 4]
输出:3

示例 2:

输入:m = 1, n = 2, a = [7, 8, 9, 3, 5]
输出:-1

示例 3:

输入:m = 1, n = 4, a = [7, 8, 9, 3, 5]
输出:3

我们需要根据给定的分数数组和晋级淘汰的人数区间,确定一个合适的分数线,使得晋级和淘汰的项目组数量都在给定的区间[m,n][m, n]内。我们可以通过遍历可能的分数线,来找到满足条件的最小分数线。

首先,我们明确问题的要求:

  1. 输入

    • m 和 n:表示晋级和淘汰的项目组数量的区间 [m, n]
    • scores:项目组的得分数组,这些得分已经由评委会根据提交的材料给出,并且这些得分是连续的整数(在示例中是以 81, 82, 83, ..., 8k 的形式给出,但这里我们假设 k 是一个具体的值,使得数组是完整的)。
  2. 输出

    • 一个整数,表示满足条件的最小分数线。如果不存在这样的分数线,则输出 -1
  3. 条件

    • 分数线 m 使得得分大于 m 的项目组晋级,其他的项目组淘汰。
    • 晋级和淘汰的项目组数量都必须在区间 [m, n] 内。

为了找到满足条件的最小分数线,我们可以按照以下步骤进行:

  1. 排序

    • 首先,对 scores 数组进行排序。这是因为我们需要能够方便地遍历每一个可能的分数线,并计算得分大于该分数线的项目组数量。排序后,我们可以简单地通过索引来设置分数线,并计算得分大于该索引对应分数的项目组数量。
  2. 遍历

    • 遍历排序后的 scores 数组,将每一个分数作为可能的分数线。
  3. 计算

    • 对于每一个可能的分数线,计算得分大于该分数线的项目组数量(即晋级数量)。
    • 同时,计算淘汰数量,即总项目组数量减去晋级数量。
  4. 检查

    • 检查当前分数线是否满足条件:晋级数量和淘汰数量是否都在区间 [m, n] 内。
  5. 记录

    • 如果找到满足条件的分数线,记录它。因为我们希望找到最小的分数线,所以只需要记录第一个找到的满足条件的分数线即可。
  6. 返回

    • 如果遍历结束后找到了满足条件的分数线,则返回它。
    • 如果没有找到满足条件的分数线,则返回 -1
  • 在实现时,要注意索引和分数线的对应关系。因为数组是从 0 开始索引的,而分数线是实际的分数值,所以计算时要小心不要混淆。
  • 在示例中,8k 表示的是一个假设的连续整数序列的终点。在实际代码中,我们不需要知道 k 的具体值,因为 scores 数组已经给出了所有的分数。
  • 如果 scores 数组中的分数不是连续的,或者包含重复分数,算法仍然适用,因为排序和遍历的过程不会受到分数连续性的影响。

下面是Python代码实现:

def solution(m: int, n: int, a: list) -> int:
    a.sort()  # 先对分数进行排序  
    k = len(a)  
      
    # 遍历所有可能的分数线  
    for i in range(k):  
        threshold = a[i]  
          
        # 计算得分大于threshold的项目组数量  
        above_threshold = sum(score > threshold for score in a)  
          
        # 计算晋级和淘汰的项目组数量  
        晋级数量 = above_threshold  
        淘汰数量 = k - 晋级数量  
          
        if m <= 晋级数量 <= n and m <= 淘汰数量 <= n:  
            return threshold  
      
    return -1  

if __name__ == '__main__':
    print(solution(2, 3, [1, 2, 3, 5, 6, 4]) == 3)
    print(solution(1, 2, [7, 8, 9, 3, 5]) == -1)
    print(solution(1, 4, [7, 8, 9, 3, 5]) == 3)