题解【CF1271C Shawarma Tent】

通过分析样例可以发现,离学校越近的地点经过的路线也会越多,因此我们只要考虑学校周围的八个点即可。而且可以发现,对于一个点,路线会经过这个点的节点是确定的。因此在输入的时候可以统计学校周围八个节点被经过的次数,然后找最大的一个即可。注意判断边界。

#include
#include
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;
}

你可能感兴趣的:(题解【CF1271C Shawarma Tent】)