蓝桥杯——数三角——STL(map的简单用法)

思想:1、可以枚举一个点为圆心,再枚举另一个点来连接这个点组成半径,长为d,即为该点到圆心的距离。

2、用map来记录一下有多少个点在这个圆上,即有多少个“”等腰三角形“”,先计算答案后再更新map

通过计算对称点来在set里面找题目给的是否有这个计算的对称点,有的话说明三点共线。

并且这一条线会被记录两次,分别是除去中心点 剩余的点被枚举到时候记录的、所有在答案我们要去掉cnt/2

学习:

map<int,int> mp

第一个是关键字,第二个是记录关键字的个数,二者一一映射,并且map是排好序的

代码:

#include <iostream>
#include <cstring>
#include <set>
#include <map>
#include <algorithm>
#define int long long
using namespace std;

const int N = 2020;

int x[N],y[N];
int n,ans;

int dis(int i,int j)
{
    return (x[i]-x[j])*(x[i]-x[j])+(y[i]-y[j])*(y[i]-y[j]);
}

signed main()
{
	cin >> n;
	set<pair<int,int>> s;
	for(int i=1;i<=n;i++){
		cin >> x[i] >> y[i];
		s.insert({x[i],y[i]});
	}
	map<int,int> mp;
	for(int i=1;i<=n;i++){
		int cnt=0;
		for(int j=1;j<=n;j++){
			if(i!=j){
				int d=dis(i,j);
				ans+=mp[d];
				mp[d]++;
				int xx=2*x[i]-x[j];
                int yy=2*y[i]-y[j];
                //用set集合,记录题目给的坐标点 是否有我们计算出来的对称的点
                //有:说明此时三个点共线,记录一下,再最后减去
                if(s.count({xx,yy}))cnt++;
			}
		}
		ans-=cnt/2;
		mp.clear();
	}
	cout << ans;
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值