2021京东笔试(测开岗)02中庸的数

题目描述

有若干个形成一个可重复集合,它们中很多都想做一个中庸的数,即既不是集合中最大的(或之一),也不是集合中的最小的(或之一)。显然,不可能满足所有的数。好在还是有一些数并不介意这一点。你需要从这些数中选出一个可重的子集,该子集中介意成为最值的数都得到满足(指不能成为子集中的最值)。请计算可以取的最大可重子集的大小。

输入描述

第一行一个整数n,1<=n<=100000
后面n行,每行两个整数x,y<=1000000000,y为0或1。x表示该数的值,y为1表示该数不介意成为最值,为0则表示介意。
样例输入
5
4 1
2 0
8 1
9 0
5 0

输出描述

一个整数,表示可取的最大的子集大小
样例输出
3

import java.util.*;

public class JD2{
    public static void main(String[] args){
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        int num = 0; // 记录的是值在max和min区间内,介意值为0的个数
        int max = Integer.MAX_VALUE; // int可取的最大值2^31也就是2147483647
        int min = Integer.MIN_VALUE; // int可取的最小值-2^31也就是-2147483647
                					 // byte.MAX_VALUE同理是byte最大值127
        							 // byte.MIN_VALUE同理是byte最小值-128*
        							 
        while(sc.hasNext()){
            int[] a = new int[n*2]; // 数组大小为2n,n组数,一组两个
            for(int i = 0; i < n*2; i++){
                a[i] = sc.nextInt(); // 将所有数存到一个数组中
                if(a[i] == 1 && a[i-1] >= max){ // 求最大值max
                    max = a[i-1];
                    if(i==1) // 将第一个介意值为1的数赋值给min
                        min = a[i-1];
                } else if(a[i] == 1 && a[i-1] <= min) { // 求最小值max
                    min = a[i-1];
                }
            }
            for(int j = 0; j < n*2; j++){ // 遍历数组找打在min和max区间内介意值为0的个数
                if(a[j] == 0 && a[j-1] < max && a[j-1] > min){
                    num++;
                }
            }
            System.out.println(num+2); // 输出最大子集:2个介意值为1的首尾,及在min和max区间介意值为0的个数
        }
    }
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值