题目描述
有若干个形成一个可重复集合,它们中很多都想做一个中庸的数,即既不是集合中最大的(或之一),也不是集合中的最小的(或之一)。显然,不可能满足所有的数。好在还是有一些数并不介意这一点。你需要从这些数中选出一个可重的子集,该子集中介意成为最值的数都得到满足(指不能成为子集中的最值)。请计算可以取的最大可重子集的大小。
输入描述
第一行一个整数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的个数
}
}
}