题目大意:给出w为宽,h为高的一个长方形,里面有n个点,给出每个点的坐标,最后给出s为宽,t为高的一个长方形,问用这个长方形最多可以围住多少个点。数据范围很小,可以直接计算map[i][j]记录从(1,1)到(i,j)的长方形中的点数。map[i][j] - map[i-t][j] - map[i][j-s]
+ map[i-t][j-s]得到一个端点为ij的小长方形,找出所有长方形的最大值。
代码如下
#include<stdio.h>
#include<string.h>
int map[110][110];
int max(int x,int y)
{
return x>y?x:y;
}
void main()
{
int i,j,n,w,h,s,t,x,y,ans;
while(scanf("%d",&n)!=EOF)
{
if(n==0)
break;
ans=0;
memset(map,0,sizeof(map));
scanf("%d%d",&w,&h);
while(n--)
{
scanf("%d%d",&x,&y);
map[y][x]=1;
}
scanf("%d%d",&s,&t);
for(i=1;i<=h;i++)
{
for(j=1;j<=w;j++)
{
x=i-t>0?i-t:0;
y=j-s>0?j-s:0;
map[i][j]+=(map[i-1][j]+map[i][j-1]-map[i-1][j-1]);
ans=max(ans,map[i][j]-map[i][y]-map[x][j]+map[x][y]);
}
}
printf("%d\n",ans);
}
}