HDU 4007 Dave 枚举

来源:互联网 发布:电路图仿真软件下载 编辑:程序博客网 时间:2024/05/16 08:01

题意:给你n个点(n<=1000),然后给你一个正方形,问这个正方形最多能覆盖多少个点。

一般思路都是将正方形先x方向移然后再向y移求最大,显然是需要排序的,方便统计。那么会不会tle呢?两个for,n*n 可以满足。

#include <iostream>#include <cstdio>#include <algorithm>using namespace std;const int maxn=1010;struct point{    int x,y;}p[maxn];bool cmp(point p1,point p2){    return p1.x<p2.x;}int n,r,ans,k;int t[maxn];int init(){    int i,j;    int cnt,tmp=0;    for(i=0;i<k;i++)    {        cnt=0;        j=i;        while(t[j]-t[i]<=r)        {            j++;            cnt++;            if(j>=k) break;        }        if(cnt>tmp) tmp=cnt;    }    return tmp;}int main(){    int tt=0;    while(scanf("%d %d",&n,&r)!=EOF)    {        ans=0;        int i,j,xmin,xmax,tm;        for(i=0;i<n;i++)            scanf("%d%d",&p[i].x,&p[i].y);        sort(p,p+n,cmp);        for(i=0;i<n;i++)        {            xmin=p[i].x;            xmax=xmin+r;            k=0;            for(j=i;p[j].x<=xmax&&j<n;j++)            {                t[k++]=p[j].y;            }            sort(t,t+k);            tm=init();            if(ans<tm) ans=tm;        }        printf("%d\n",ans);    }    return 0;}


0 0