pipioj1322

84 阅读1分钟

题目描述

平面上有N个坐标各异的点,现在PIPI想知道这N个点当中有多少组非共线的三个点,这三个点的 外心 也在这个N点之中?
PS:三个非共线的点可以确定一个三角形,三角形的外接圆的圆心就是这三个点的外心。

输入

第一行有一个正整数 nn 代表平面上的点数。

接下来有 nn 行,当中的第 ii 行包含两个整数 x,y,代表第 ii 个点的坐标。

  • 1≤n≤2000

  • -1e9<=x,y<=1e9

输出

输出一个整数代表答案。

样例输入

5
0 0
-2 0
0 2
-1 1
2 0

样例输出

2

题目思路

思路一:预处理使用map将三个点的外心存起来,遍历坐标找外心个数。能得结果,但会内存超限

思路二:枚举外心

将每个点到其他点的距离存起来,到其他点的距离相等的个数n大于3的时候,就可以记录入结果ans += Cn3。

代码实现

#include <bits/stdc++.h>using namespace std;const int N = 2005;vector<int> d[N];   // 存每个外心到其他点的距离vector<pair<int,int> > ordinate;    // 存坐标int main(){    int n;    scanf("%d",&n);    for(int i = 0;i < n;i++){        int x,y;        scanf("%d%d",&x,&y);        ordinate.push_back({x,y});    }    // 遍历坐标,存距离    for(int i = 0;i < ordinate.size();i++){        for(int j = 0;j < ordinate.size();j++){            pair<int,int> temp1 = ordinate[i],temp2 = ordinate[j];            int dis = (temp1.first - temp2.first) * (temp1.first - temp2.first) + (temp1.second - temp2.second) * (temp1.second - temp2.second);            d[i].push_back(dis);        }    }    // 找相同距离    int ans = 0;    for(int i = 0;i < n;i++){        vector<int> temVec = d[i];        sort(temVec.begin(),temVec.end());        int x = temVec[0];        int cnt = 1;    //  记录相等个数        for(int i = 1;i < temVec.size();i++){            if(temVec[i] != x) {                if(cnt >= 3)    ans += cnt*(cnt-1)*(cnt-2) / 6;                x = temVec[i];                cnt = 1;            }else{                cnt++;            }        }        if(cnt >= 3)    ans += cnt*(cnt-1)*(cnt-2) / 6;    }    printf("%d\n",ans);    return 0;}