链接:
https://vj.e949.cn/889526602f1f7ab5e44d789392754748?v=1539700751
题意:
给出n个坐标点,问任选两个点,这两个点连成直线斜率绝对值为1的情况有多少种。
思路:
已经第二次做了,可惜还是错了好多次。
这个题暴力的话,毋庸置疑会超时,降低复杂度的做法是,把每个点看作斜率为1或-1直线经过的点,直接存对应的截距 b的值,
然后在b相等的点种直接找有多少对就行了。
代码:
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
map<double,ll> ma1;
map<double,ll> ma2;
map<double,ll> ::iterator it;
ll n;
double x, y;
int main()
{
while(scanf("%lld",&n) != EOF)
{
ma1.clear();
ma2.clear();
ll sum = 0;
for(int i = 0; i < n; i++)
{
scanf("%lf%lf",&x,&y);
ma1[y+x]++;
ma2[y-x]++;
}
for(it = ma1.begin(); it != ma1.end(); it++)
{
ll t = it->second;
if(t>=2)
{
sum += t * (t-1);
}
}
for(it = ma2.begin(); it != ma2.end(); it++)
{
ll t = it->second;
if(t >= 2)
{
sum += t * (t-1);
}
}
sum = double (sum);
printf("%.6g\n",sum / (double)(n * n));
}
return 0;
}