通过分析样例可以发现,离学校越近的地点经过的路线也会越多,因此我们只要考虑学校周围的八个点即可。而且可以发现,对于一个点,路线会经过这个点的节点是确定的。因此在输入的时候可以统计学校周围八个节点被经过的次数,然后找最大的一个即可。注意判断边界。
#include<iostream>
#include<cstdio>
using namespace std;
int n,sx,sy,ans=-1,ansx,ansy;
int dx[8]={-1,0,1,1,1,0,-1,-1},dy[8]={-1,-1,-1,0,1,1,1,0};
int cnt[8];//左上,上,右上,右,右下,下,左下,左
void check(int x,int y)
{
cnt[0]+=(x<=sx-1 && y<=sy-1);
cnt[1]+=(y<=sy-1);
cnt[2]+=(x>=sx+1 && y<=sy-1);
cnt[3]+=(x>=sx+1);
cnt[4]+=(x>=sx+1 && y>=sy+1);
cnt[5]+=(y>=sy+1);
cnt[6]+=(x<=sx-1 && y>=sy+1);
cnt[7]+=(x<=sx-1);
}//统计
int main()
{
scanf("%d%d%d",&n,&sx,&sy);
for(int i=1,x,y;i<=n;i++)
{
scanf("%d%d",&x,&y);
check(x,y);
}
for(int i=0,nx=sx+dx[i],ny=sy+dy[i];i<8;i++,nx=sx+dx[i],ny=sy+dy[i])
if(nx>=0 && nx<=1e9 && ny>=0 && ny<=1e9 && cnt[i]>ans)
ans=cnt[i],ansx=nx,ansy=ny;
printf("%d\n%d %d",ans,ansx,ansy);
return 0;
}