题意:
输入数据如下
N
W H
x1 y1
x2 y2
...
xN yN
S T
一个国家的土地为W*H的大小,W为宽度,H为高度,比如下图,W为10,H为8
在这个国家中,你可以圈一个S宽度,T高度的地归你自己,你要把
尽可能多的*圈进你的地中
注意(4,3)和(3,4)是不同的圈地方式
x1 y1
x2 y2
...
xN yN
是*点的位置
我的解法:
枚举所有可能的圈地方式,用二维树状数组算出该圈地得到了多少个*,取最大结果输出
代码如下:
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<iostream>
#include<algorithm>
using namespace std;
#define MAX 200
int c[MAX][MAX];//树状数组
int W,H;
int lowbit(int x)
{
return x&(-1*x);
}
void update(int x,int y)
{
for(int i=x;i<=W;i+=lowbit(i))
{
for(int j=y;j<=H;j+=lowbit(j))
{
c[i][j]++;
}
}
}
int getsum(int x,int y)
{
int ans=0;
for(int i=x;i>=1;i-=lowbit(i))
{
for(int j=y;j>=1;j-=lowbit(j))
{
ans+=c[i][j];
}
}
return ans;
}
int main()
{
int n;
while(scanf("%d",&n),n)
{
memset(c,0,sizeof(c));//树状数组初始化
scanf("%d %d",&W,&H);
for(int i=0;i<n;i++)
{
int x,y;
scanf("%d %d",&x,&y);
update(x,y);
}
int w,h;
scanf("%d %d",&w,&h);
int res=-1;
for(int i=w;i<=W;i++)//枚举所有可能的圈地方式
{
for(int j=h;j<=H;j++)
{
int temp=getsum(i,j)-getsum(i,j-h)-getsum(i-w,j)+getsum(i-w,j-h);
if(res<temp)
{
res=temp;
}
}
}
printf("%d\n",res);
}
return 0;
}