题目链接:
计算机软件能力认证考试系统http://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);
}
}