青训营 X 豆包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

思路

排序:
    对得分数组 a 进行升序排序,以便于后续处理。

遍历可能的分数线:
    从数组的第一个元素到倒数第二个元素(即 a[0] 到 a[len-2]),逐个作为分数线 x 进行检查。
    选择 a[len-2] 而不是 a[len-1] 是因为最后一个元素不可能作为分数线,因为它没有更大的分数来形成晋级的项目组。

计算晋级和淘汰数量:
    对于每个分数线 x,计算大于 x 的项目组数量(晋级数量)和小于等于 x 的项目组数量(淘汰数量)。
    晋级数量可以通过数组长度减去当前索引加一得到。
    淘汰数量可以通过当前索引加一得到。

检查条件:
    检查晋级和淘汰的数量是否都在 [m, n] 之间。
    如果是,则记录当前分数线 x 并返回。

返回结果:
    如果遍历完所有可能的分数线后都没有找到满足条件的分数线,则返回 -1。

代码

import java.util.Arrays;

public class Main {

public static int solution(int m, int n, int[] a) {

// 对得分数组进行排序

Arrays.sort(a);

    int len = a.length;
    
    // 遍历所有可能的分数线
    for (int i = 0; i < len - 1; i++) {
        int passCount = len - (i + 1);  // 晋级数量
        int failCount = i + 1;  // 淘汰数量
        
        // 检查晋级和淘汰的数量是否在 [m, n] 之间
        if (passCount >= m && passCount <= n && failCount >= m && failCount <= n) {
            return a[i];  // 返回当前分数线
        }
    }
    
    // 如果没有找到满足条件的分数线,返回 -1
    return -1;
}

public static void main(String[] args) {
    System.out.println(solution(2, 3, new int[]{1, 2, 3, 5, 6, 4}) == 3);
    System.out.println(solution(1, 2, new int[]{7, 8, 9, 3, 5}) == -1);
    System.out.println(solution(1, 4, new int[]{7, 8, 9, 3, 5}) == 3);
    System.out.println(solution(17, 79, new int[]{725,835,16,137,539,407,912,766,279,368,454,216,957,680,984,369,873,776,902,337,751,432,102,727,93,848,941,427,321,706,466,907,509,629,296,418,457,768,445,104,864,625,289,659,441,65,585,518,225,441,287,928,720,232,561,936,393,523,270,901,738,45,40,507,447,929,100,612,559,408,860,36,387,606,318,677,828,419,246,33,437,508,203,901,363,442,609,840,877,269,815,197,38,179,896,896,331,697,334,309,560,669,1,504,309,627,37,10,475,193,567,910,496,965,615,868,368,650,361,107}) == 368);
}

}

相关推荐
DC妙妙屋29 分钟前
10.24.2024刷华为OD C题型(四) -- 对象list按照多个属性排序
1024程序员节
bitenum1 小时前
qsort函数的学习与使用
c语言·开发语言·学习·算法·visualstudio·1024程序员节
EmotionFlying2 小时前
(11)(2.1.6) Hobbywing DroneCAN ESC(一)
copter·ardupilot·1024程序员节·电调和电机
伏飞而行2 小时前
六、元素应用CSS的习题
1024程序员节
idealzouhu2 小时前
Spring Boot 实现文件上传下载功能
java·spring boot·1024程序员节
sudo_Ene3 小时前
Isaac Sim Docker 部署并使用过程记录
笔记·学习·docker·1024程序员节·isaacsim
天使的同类3 小时前
uniapp使用easyinput文本框显示输入的字数和限制的字数
1024程序员节
Elastic 中国社区官方博客4 小时前
GraphQL 与 Elasticsearch 相遇:使用 Hasura DDN 构建可扩展、支持 AI 的应用程序
大数据·后端·elasticsearch·搜索引擎·全文检索·graphql·1024程序员节
·云扬·4 小时前
WeakHashMap详解
java·开发语言·学习·1024程序员节
Dennis_nafla5 小时前
《MYSQL实战45讲》表数据删一半,为什么表文件大小不变?
mysql·1024程序员节