hdu 4007 暴力枚举 Dave

来源:互联网 发布:易语言读取网页json 编辑:程序博客网 时间:2024/05/16 11:04

题意:

       给你n个点,找存在于R里面的最多点数,包括边缘的点。

解:

      暴力枚举。将点按x排序。对于每个x,将在x+R范围内的点记录下来。从上到下枚举以谁作为上边界。每次找最大即可。

做题过程:

     哎,又是写错了一个地方肿么都看不出来。而且不是逻辑性错误,只是笔误而已。。。。

/*Pro: 0Sol:date:*/#include <iostream>#include <cstdio>#include <algorithm>#include <cstring>#include <cmath>#include <queue>#include <set>#include <vector>#define inf 1000000111using namespace std;int n,R,y[1111],ans;struct point{    int x,y;    bool operator < (const point & cmp) const{        return x < cmp.x;    }}p[1111];int main(){    while(scanf("%d%d",&n,&R) != EOF){        ans = 0;        int min_x = inf, min_y = inf, max_x = -inf, max_y = -inf;        for(int i = 0; i < n; i ++){            scanf("%d%d",&p[i].x, &p[i].y);            min_x = min(min_x,p[i].x);            max_x = max(max_x,p[i].x);            min_y = min(min_y,p[i].y);            max_y = max(max_y,p[i].y);        }        if(max_x - min_x <= R && max_y - min_y <= R){//            cout << min_x << max_x << min_y << max_y << endl;            printf("%d\n",n); continue;        }        sort(p,p + n);        for(int i = 0; i < n; i ++){//以i的x为左边界            int j = i, sub = 0;//不能等于i + 1,这样忽略了本身            while(p[j].x <= p[i].x + R && j < n) {                y[sub ++] = p[j].y;                j ++;            }            sort(y,y + sub);  j = 0;//            cout << sub << "  kakka  " << endl;            for(int k = 0; k < sub && j < sub; k ++){//这里还要加上个j < sub                while(y[j] <= y[k] + R && j < sub)   {//                    printf("I will  %d\n",p[j].y); 哎,这里写成了p[j].y <= p[k].y + R 了,受上面的影响                    j ++;//这里是小于sub。。。                }                ans = max(ans,j - k);//                printf("%d   %d\n",i,ans);            }        }        printf("%d\n",ans);    }    return 0;}


原创粉丝点击