优秀项目组初选评比(优秀项目组初选评比 - MarsCode)
公司正在进行优秀项目组评比的初选工作,参赛者有小C、小U、小R、小S、小M和小F的项目组。评委会已经根据他们提交的材料完成了打分,各个项目组的得分分别是。评委们希望设定一个初选晋级的分数线xx,让所有得分大于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]。scores:项目组的得分数组,这些得分已经由评委会根据提交的材料给出,并且这些得分是连续的整数(在示例中是以81, 82, 83, ..., 8k的形式给出,但这里我们假设k是一个具体的值,使得数组是完整的)。
-
输出:
- 一个整数,表示满足条件的最小分数线。如果不存在这样的分数线,则输出
-1。
- 一个整数,表示满足条件的最小分数线。如果不存在这样的分数线,则输出
-
条件:
- 分数线
m使得得分大于m的项目组晋级,其他的项目组淘汰。 - 晋级和淘汰的项目组数量都必须在区间
[m, n]内。
- 分数线
为了找到满足条件的最小分数线,我们可以按照以下步骤进行:
-
排序:
- 首先,对
scores数组进行排序。这是因为我们需要能够方便地遍历每一个可能的分数线,并计算得分大于该分数线的项目组数量。排序后,我们可以简单地通过索引来设置分数线,并计算得分大于该索引对应分数的项目组数量。
- 首先,对
-
遍历:
- 遍历排序后的
scores数组,将每一个分数作为可能的分数线。
- 遍历排序后的
-
计算:
- 对于每一个可能的分数线,计算得分大于该分数线的项目组数量(即晋级数量)。
- 同时,计算淘汰数量,即总项目组数量减去晋级数量。
-
检查:
- 检查当前分数线是否满足条件:晋级数量和淘汰数量是否都在区间
[m, n]内。
- 检查当前分数线是否满足条件:晋级数量和淘汰数量是否都在区间
-
记录:
- 如果找到满足条件的分数线,记录它。因为我们希望找到最小的分数线,所以只需要记录第一个找到的满足条件的分数线即可。
-
返回:
- 如果遍历结束后找到了满足条件的分数线,则返回它。
- 如果没有找到满足条件的分数线,则返回
-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)