hdu 4007

来源:互联网 发布:解数独的软件 编辑:程序博客网 时间:2024/05/29 10:09

题目

大意:在一个X-Y平面内有n个点,用一个r*r的正方形去覆盖,问最多覆盖多少个点


想法:先把坐标离散化,那最坏情况下就是一个n*n的区域,然后求最大子矩阵(矩阵的边长不能超过r)

#include<stdio.h>#include<string.h>#include<map>#include<algorithm>using namespace std;#define N 1005int a[N],b[N],n,r,k1,k2;int c[N][N],num[N][N],lx[N],ly[N],px[N],py[N];map<int,int>x,y;map<int,int>::iterator it;int main(){    while(~scanf("%d%d",&n,&r))    {        x.clear(),y.clear();        memset(c,0,sizeof(c));        memset(num,0,sizeof(num));        for(int i=0;i<n;i++)        {            scanf("%d%d",&a[i],&b[i]);            if(x[a[i]]==0) x[a[i]]=1;            if(y[b[i]]==0) y[b[i]]=1;        }        //离散化        k1=1;        for(it=x.begin();it!=x.end();it++)        {            x[(*it).first]=k1;            lx[k1++]=(*it).first;        }        k2=1;        for(it=y.begin();it!=y.end();it++)        {            y[(*it).first]=k2;            ly[k2++]=(*it).first;        }        for(int i=0;i<n;i++)            c[x[a[i]]][y[b[i]]]++;//找出离散后的某一点,把他作为正方形的一个角,相邻角的最远可能        for(int i=1;i<k1;i++)        {            px[i]=k1-1;            for(int j=i;j<k1;j++)            {                if(lx[j]-lx[i]>r) {px[i]=j-1;break;}            }        }        for(int i=1;i<k2;i++)        {            py[i]=k2-1;            for(int j=i;j<k2;j++)            {                if(ly[j]-ly[i]>r) {py[i]=j-1;break;}            }        }        for(int i=1;i<k1;i++)            for(int j=1;j<k2;j++)        {            num[i][j]=num[i-1][j]+num[i][j-1]-num[i-1][j-1]+c[i][j];        }        int ans=0;        for(int i=1;i<k1;i++)            for(int j=1;j<k2;j++)        {            int temp=num[px[i]][py[j]]-num[px[i]][j-1]-num[i-1][py[j]]+num[i-1][j-1];            ans=max(temp,ans);        }        printf("%d\n",ans);    }    return 0;}


原创粉丝点击