【问题描述】
在一个平面直角坐标系中给定n个整点,分别以每个整点为圆心,画一个半径为r的圆,请你求出以哪个整点为圆心画的圆包含的整点最多,输出这个值。
【输入形式】
第一行输入两个整数n和r,分别表示整点的数量和半径的值
接下来n行每行输入两个整数x,y,分别表示整点的横坐标和纵坐标
【输出形式】
输出以给定的n个整点中的某个点为圆心画一个半径为r的圆所能包含的最大整点数
【样例输入】
3 2
0 0
0 2
2 0
【样例输出】
3
【样例说明】
以(0,0)这个点为圆心画一个半径为2的圆,可以包含3个点
而以(0,2)或(2,0)为圆心画一个半径为2的圆,只能包含2个点
因此最多能包含3个整点
【评分标准】
对于100%的数据,保证-1e9<=x,y<=1e9,1<=r<=2e9
对于40%的数据,保证1<=n<=100
对于100%的数据,保证1<=n<=5000
题目解析
点的数据范围不大,平方枚举可以解决
要注意计算距离会爆int,需要开long long 进行运算
利用pair存储点坐标会直观一些
代码实现
#include <iostream>
#include <algorithm>
#include <cstring>
#include <vector>
using namespace std;
typedef pair <long long , long long > PLL;
vector <PLL> s;
int n;
long long r;
int main()
{
cin >> n >> r;
for (int i = 0; i < n; i ++)
{
long long x, y;
cin >> x >> y;
s.push_back({x, y});
}
int res = 0;
for (int i = 0; i < n; i ++)
{
int temp = 0;
for (int j = 0; j < n; j ++)
{
//整数运算要考虑是否会爆int
if((s[i].first - s[j].first) * (s[i].first - s[j].first) + (s[i].second - s[j].second) * (s[i].second - s[j].second) <= r * r)
{
temp ++;
}
}
res = max(res, temp);
}
cout << res;
return 0;
}
该博客介绍了如何在给定半径和多个整点的平面直角坐标系中,找到一个圆心,使得以该点为圆心的圆能包含最多的整点。通过平方枚举的方法,计算每个点作为圆心时能包含的整点数量,并找出最大值。题目要求注意整数溢出问题,使用long long类型进行计算,最后输出最大包含的整点数。
&spm=1001.2101.3001.5002&articleId=122140504&d=1&t=3&u=fe910b1b86bb46ea8a59312977f17c9b)
2278

被折叠的 条评论
为什么被折叠?



