hdu 4007题解

hdu 4007解题报告

 

题意:被包含在正方形内(包括边界上)点数最多是多少

 

解析:先对所有的点根据x排序,再在x轴上枚举,每次的正方形x轴上的边界是x[i]~limx;在这基础上找出x在该范围上的所有的点的y值存到数组y[]上并且排序,然后再进行枚举刷新正方形上的最多点数ans值。

 

代码:

 

#include<iostream>

#include<stdio.h>

#include<stdlib.h>

#include<algorithm>

#include<vector>

#include<string>

#include<queue>

 

using namespace std;

 

const int INF = 2000000000;

 

//存放点坐标的结构体

struct node{

         intx, y;

}zb[1005];

 

//从小到大排序

bool cmp(node a, node b){

         if(a.x == b.x )

                   returna.y < b.y;

         returna.x < b.x;

}

 

//存放在x边长范围上的点的y坐标值

int y[1005];

 

 

 

int main()

{

         intn, r, i, j, k;

         intlimx, limy, ans, temp;

        

         while( scanf("%d%d",&n,&r) != EOF )

         {

                   for(i = 0; i < n; i ++ )

                            scanf("%d%d",&zb[i].x,&zb[i].y);

                  

                   sort(zb,zb+n, cmp);

                   ans= 0;

                  

                   intyind = 0;

                   for(i = 0; i < n; i ++ ){

                            limx= zb[i].x + r;

                            yind= 0;

//找出x上的所有的点的y值

                            for(j = i; j < n; j ++ )

                                     if(zb[j].x >= zb[i].x && zb[j].x <= limx ){

                                               y[yind]= zb[j].y;

                                               yind++ ;

                                     }elsebreak;

                           

                            sort(y,y+yind);  //给y值排序

                           

                            y[yind]= INF;

                            temp= 0;

                            for(j = 0; j < yind; j ++ ){

                                     limy= y[j]+r;

                                     while(y[temp] <= limy ) temp ++ ;

                                     if(temp - j > ans ) ans = temp-j;  //刷新结果值

                                    

                            }

                           

                   }

                  

                   printf("%d\n",ans);

         }

        

         return0;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值