链接:
https://cn.vjudge.net/problem/1153119/origin
题意:
给出n个点坐标,问距离为2018的点有多少对。
思路:
最开始的思路是,先按照x排序,然后比较时x之差大于2018则停止。这样是会超时的,因为不管按照x排序或者按照y排序,都有可能被卡数据。
所以最新思路是按照每个点距离原点的距离排序,如果距原点之差大于2018,则停止(运用的是三角形两边之差小于第三边),考虑到在一条直线的情况后,就是大于2018而不是大于等于2018了。
代码:
#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e5+3;
typedef unsigned long long ll ;
struct Node
{
ll x, y;
double len;
friend bool operator < (Node &a,Node &b)
{
return a.len < b.len;
}
}node[maxn];
ll dis(Node a, Node b)
{
int x1 = max(a.x,b.x);
int x2 = min(a.x,b.x);
int y1 = max(a.y,b.y);
int y2 = min(a.y,b.y);
return (x1-x2)*(x1-x2)+(y1-y2)*(y1-y2);
}
int main()
{
int n;
cin>>n;
for(int i = 0; i < n ;i++)
{
cin>>node[i].x>>node[i].y;
node[i].len = sqrt(node[i].x*node[i].x+node[i].y*node[i].y);
}
sort(node,node+n);
int ans = 0;
ll base = 2018 * 2018;//精度问题,一定要比较乘方
for(int i = 0 ; i < n; i++)
{
for(int j = i+1 ;j < n; j++)
{
if(node[j].len-node[i].len > 2018)
break;
if(dis(node[i],node[j]) == base )
{
ans++;
}
}
}
cout<<ans<<endl;
return 0;
}