Comet OJ - Contest #15 (B 当我们同心在一起)

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;
}
发布了55 篇原创文章 · 获赞 1 · 访问量 970

猜你喜欢

转载自blog.csdn.net/weixin_43556527/article/details/103229362