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

题目链接

题目描述




求解思路

前缀和

  1. 根据题意我们可以得知:θ θ θ 值为 a[i].y 时的预测正确的次数等于 a[i].y 前面有多少个 result = 0 以及后面有多少个result = 1。
  2. 定义Score类用来存储y和result,其中sum0表示a[1]到a[i]有多少个result = 0,sum1表示a[1]到a[i]有多少个result = 1,sum表示阈值取到a[i].y时预测正确的次数。然后写一个类的比较方法用于排序。
  3. 数组a[]用来存放每个同学的y和result。
  4. 对数组进行排序,并求得sum0和sum1。
  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);
    }
}
相关推荐
dialect_14 小时前
KMP算法
开发语言·c++·算法
captain37614 小时前
MyBatis(入门5)其他查询操作
java·数据库·spring boot·mybatis
reikocao14 小时前
卡尔曼滤波的动态机制:P如何改变融合权重
算法
Novproxy_Z15 小时前
商用代理避坑:如何识别商家拿机房 IP 冒充住宅 IP
java·网络·tcp/ip
总要学点什么15 小时前
第89篇:三维特效-螺旋圆效果——让螺旋臂卷起一圈圈外扩的涟漪
开发语言·javascript·ecmascript·webgl·cesium·空间分析·1024程序员节
漂流瓶jz15 小时前
UVA-1612 猜名次 题解答案代码 算法竞赛入门经典第二版
数据结构·算法·题解·排序·aoapc·算法竞赛入门经典
吞下星星的少年·-·15 小时前
Div.2 CF 1130B题(构造,贪心)
算法·贪心·构造
文丑颜不良啊15 小时前
LeetCode1481~1500题目解析
java·leetcode
2601_9628857215 小时前
quotes 字段全解:涨跌幅、振幅、换手率的口径与单位
java·前端·spring
前端精髓16 小时前
调用openrouter的免费API模型
java·前端·javascript