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

题目链接:

计算机软件能力认证考试系统icon-default.png?t=M276http://118.190.20.162/view.page?gpid=T122

【分析】看数据量10^5,如果挨个遍历y的值再计算正确率的话,O(n^2)的时间复杂度必然超时,所以计算正确率只能在y遍历时通过其他方法来算。因此我们可以先对数据按照y的大小进行排序,然后统计出result为1时的正确个数,这个可以作为以y[0]进行划分时总的正确个数。

接下来y从i=1开始遍历,在遍历的过程中,当前i-1处的值如果是0,则result为0时正确的个数+1;如果当前i-1处的值为1,说明在i处划分时把一个本来为1正确的放在为0的那部分了,所以result为1的正确个数-1。好像这也是前后缀和的思想,近几年CSP第二题几乎都用到这种思想去优化剩余30%的数据了。

需要特别注意(0,0)(0,1)(0,1)这种一个y对应多个result的情况,只用第一次得到的结果进行比较。

import java.util.*;

public class Main {

    static class Pair{
        public int val;
        public int flag;
        public Pair(int val, int flag){
            this.val = val; this.flag = flag;
        }
    }

    static class Comporator implements Comparator<Pair>{
        @Override
        public int compare(Pair o1, Pair o2) {
            if(o1.val < o2.val) return -1;
            return 1;
        }
    }

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int i, n, a, b;
        n = scanner.nextInt();
        List<Pair> list = new ArrayList<>();
        int num0 = 0, num1 = 0;
        for(i = 0; i < n; i++){
            a = scanner.nextInt();
            b = scanner.nextInt();
            if(b == 0) num0++;
            else num1++;
            list.add(new Pair(a, b));
        }
        list.sort(new Comporator());
        int ans = list.get(0).val;
        int r0 = 0, r1 = num1;
        int pre = list.get(0).val;
        int max = r1;
        for(i = 1; i < n; i++){
            if(list.get(i - 1).flag == 0){
                r0++;
            }else{
                r1--;
            }
            if(r0 + r1 >= max && list.get(i).val != pre){
                max = r0 + r1;
                ans = list.get(i).val;
            }
            pre = list.get(i).val;
        }
        System.out.println(ans);
    }

}

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值