1、对于所有数据先排个序 y小的在前,否则result小的在前
2、对result求下前缀和
3、依次枚举每一个y作为我们可能的阀值,则如果是预测正确的话,当前位置往后的result都应该为1,累加记为s1,s1的值为多少则表示往后预测对了多少,相反的,往前的都应该为0,若出现了1则表示预测错了,个数相减则为前面预测对的数量
4、在判断当前位置往前有多少预测对的时候,要排除掉前面的y与当前位置y相同的情况,用双指针法。
import java.util.Arrays;
import java.util.Scanner;
public class Main
{
public static void main(String[] args)
{
Scanner scan=new Scanner(System.in);
int n=scan.nextInt();
Node[] nodes=new Node[n];
for(int i=0;i<n;i++)
{
int y=scan.nextInt();
int result=scan.nextInt();
nodes[i]=new Node(y,result);
}
Arrays.sort(nodes);
int[] y=new int[n+1];
int[] r=new int[n+1];
for(int i=1;i<=n;i++)
{
y[i]=nodes[i-1].y;
r[i]=nodes[i-1].result;
}
for(int i=1;i<=n;i++)
r[i]+=r[i-1];
int ansy=0,ansr=-1;
for(int i=1;i<=n;i++)
{
int s1=r[n]-r[i-1];//当前位置往后看预测对的个数
int j=i;
while(j>0&&y[j]==y[i]) j--;//往前计算的时候,排除掉前面y值与当前y值一样的情况
int s2=r[j];//前面1出现的个数
if(j!=0)
s2=j-s2;//得到前面为0的个数 即预测对的情况
//得到总的预测对的数量,并更新
int s=s1+s2;
if(s>ansr)
{
ansr=s;
ansy=y[i];
}
else if(s==ansr)
{
ansy=y[i];
}
}
System.out.println(ansy);
scan.close();
}
private static class Node implements Comparable<Node>
{
private int y;
private int result;
public Node(int y,int result)
{
this.y=y;
this.result=result;
}
@Override
public int compareTo(Node o)
{
if(this.y!=o.y)
return this.y-o.y;
else
return this.result-o.result;
}
}
}
在算前面的预测正确的个数时,为什么要去掉成绩相同的数据?