【CSP:202012-2】期末预测之最佳阈值(Java)

题目链接

题目描述




求解思路

前缀和

  1. 根据题意我们可以得知:θ θ θ 值为 a[i].y 时的预测正确的次数等于 a[i].y 前面有多少个 result = 0 以及后面有多少个result = 1
  2. 定义Score类用来存储yresult,其中sum0表示a[1]a[i]有多少个result = 0sum1表示a[1]a[i]有多少个result = 1sum表示阈值取到a[i].y时预测正确的次数。然后写一个类的比较方法用于排序。
  3. 数组a[]用来存放每个同学的yresult
  4. 对数组进行排序,并求得sum0sum1
  5. 遍历数组,如果相邻的两个学生的安全指数相同,则不用处理直接得出sum值;否则利用前缀和计算出当前的sum,然后和max进行比较,相同的话取大的那个。

实现代码

java 复制代码
import java.util.Arrays;
import java.util.Scanner;

class Score {
    int y;
    int result;
    int sum0; // 记录a[1]------a[i] 有多少result = 0
    int sum1; // 记录a[1]------a[i] 有多少result = 1
    int sum; //a[i].y时的预测正确次数

    public int compare(Score score) {
        if (this.y > score.y) {
            return 1;
        } else if (this.y < score.y) {
            return -1;
        } else {
            return Integer.compare(this.result, score.result);
        }
    }
}

public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        int m = in.nextInt();
        Score[] a = new Score[m + 1];
        a[0] = new Score();
        for (int i = 1; i <= m; i++) {
            a[i] = new Score();
            a[i].y = in.nextInt();
            a[i].result = in.nextInt();
        }
        Arrays.sort(a, Score::compare);

        for (int i = 1; i <= m; i++) {
            if (a[i].result == 1) {
                a[i].sum0 = a[i - 1].sum0;
                a[i].sum1 = a[i - 1].sum1 + 1;
            } else {
                a[i].sum0 = a[i - 1].sum0 + 1;
                a[i].sum1 = a[i - 1].sum1;
            }
        }

        int ans = 0;
        int max = 0;
        for (int i = 1; i <= m; i++) {
            if (a[i].y == a[i - 1].y) {
                a[i].sum = a[i - 1].sum;
            } else {
                a[i].sum = a[i - 1].sum0 + a[m].sum1 - a[i - 1].sum1;
            }
            if (max <= a[i].sum) {
                max = a[i].sum;
                ans = a[i].y;
            }
        }
        System.out.println(ans);
    }
}
相关推荐
Java开发追求者10 分钟前
vscode导入springboot项目
java·ide·spring boot·vscode
前进的李工12 分钟前
LeetCode hot100:094 二叉树的中序遍历:从递归到迭代的完整指南
python·算法·leetcode·链表·二叉树
麦烤楽鸡翅12 分钟前
坚持60s (攻防世界)
java·网络安全·jar·ctf·misc·反编译·攻防世界
少废话h44 分钟前
Flume Kafka源与汇的topic覆盖问题解决
java·linux·kafka·flume
麦麦大数据1 小时前
F049 知识图谱双算法推荐在线学习系统vue+flask+neo4j之BS架构开题论文全源码
学习·算法·知识图谱·推荐算法·开题报告·学习系统·计算机毕业设计展示
激动的兔子1 小时前
Geoserver修行记-连接瀚高数据库显示java.sql.SQLException: org.postgresql.util.PSQLException
java·geoserver·瀚高数据库
一 乐1 小时前
健康打卡|健康管理|基于java+vue+的学生健康打卡系统设计与实现(源码+数据库+文档)
android·java·数据库·vue.js·spring boot·微信小程序
ghie90901 小时前
使用Java实现用户的注册和登录流程
java·数据库·oracle
止水编程 water_proof2 小时前
JavaScript基础
开发语言·javascript·ecmascript
兩尛2 小时前
215. 数组中的第K个最大元素
数据结构·算法·排序算法