Comet OJ - Contest #15 (B 当我们同心在一起)
解题思路
就是 一个点到另外三个点的 距离相等 呢么 这个点就是另外三个点组成
三角形 的 外心 (仔细看题目中图)
然后就是 统计 一个点到另外所有点的距离相等有多少对 这是看 赛后别人 写的
总结出来的 很巧妙 用的 map<long long ,int> mp; 相当于自带下标的一位数组
直接 将距离与距离相等的次数 建立映射关系
然后使用 迭代器 进行访问 很厉害
或者你 开一个
map映射map<long long ,int > mp;+数组 sum+index=0(坐标统计);
每次用 mp.number()来判定出现没有
没有的话 就 mp[k]=index;sum[index++]++
有就sum[mp[distence]]++;
然后 依次访问 统计的 个数 如果>=3 就
ans(个数统计)+= c(sum,3);也就是
ans+=n*(n-1)(n-2)/6
AC 代码如下
#include<bits/stdc++.h>
using namespace std;
struct node{
int x, y;
}xy[2005];
long long dis(node a,node b){
return (long long )(a.x-b.x)*(a.x-b.x)+(long long)(a.y-b.y)*(a.y-b.y);
}
int main(){
int n;
scanf("%d",&n);
for(int i=0; i<n; i++)
scanf("%d%d",&xy[i].x,&xy[i].y);
int ans=0;
for(int i=0; i<n; i++){//i作为可能的外心
map<long long ,int> mp;//创建类 一位数组
for(int j=0; j<n; j++){
if(i!=j){
long long k=dis(xy[i],xy[j]);
//统计 距离相等;
mp[k]++; //直接对映射值进行统计操作 来作为同距离个数
}
}
map<long long ,int>::iterator it;
//迭代器访问
for(it =mp.begin();it!=mp.end();it++){
if(it->second>=3) {
long long k=it->second;
//it->first 意思是 key 也就是 距离值
//it->second 意思是 value 也就是 统计值
ans+=k*(k-1)*(k-2)/6;// C(k,3)
}
}
}
cout<<ans<<endl;
return 0;
}