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;
}