题目我就不放了,其他博主哪里都有,我们直接进入主题。
首先暴力,应该是两个for循环就能解决,但是时间会超时,所以这里不再赘述。
首先我们来思考一个问题,对于一个点来说(一个同学数据)无非就是0(不合格)和1(合格)的区别,那么这个对于我们计算正确个数会产生什么影响呢?
举个例子 :
5 0
这个点,当我们阈值>5
时,这个点我们就会判断正确,反之判断错误。同样,如果是5 1
这个点,当我们阈值<=5
时,这个点我们就会判断正确,反之判断错误。也就是说当我们把阈值从4
调到6
的时候,5 0
这个点会让我们正确个数加1
,5 1
这个点会让我们正确个数减1
,所以说我们只需记录过这个点对正确个数是加还是减就行。
所以我们只需顺序遍历一遍各个点,维护正确个数
count
到这个点是该加还是该减,那么对于count
初始值是多少呢?显然就是数据中正例(1)的个数。
import java.io.*;
import java.util.*;
public class Main {
public static void main(String[] args) throws IOException {
read in =new read();
int m=in.nextInt();
Set<Integer> set=new TreeSet<>();//顺序去重存储数据点
int []arr=new int[100000005];
int count=0;
while (m-->0){
int y=in.nextInt();
int s=in.nextInt();
set.add(y);
if (s==1){
arr[y]--;//正例就减
count++;
}else {
arr[y]++;//负例就加
}
}
int max=0;//记录正确个数
int re=0;//记录最大正确个数的阈值
for (int a:set){
if (max<=count){
max=count;
re=a;
}
count+=arr[a];
}
System.out.println(re);
//时间复杂度 O(nlogn),不用Treeset直接遍历arr时间复杂度可到O(n)
}
}
class read{
StreamTokenizer st=new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in)));
BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
int nextInt() throws IOException {
st.nextToken();
return (int)st.nval;
}
long nextLong() throws IOException {
st.nextToken();
return (long)st.nval;
}
}