[蓝桥杯]真题讲解:数三角(枚举+STL)
- 一、视频讲解
- 二、正解代码
- 1、C++
- 2、python3
- 3、Java
一、视频讲解
[蓝桥杯]真题讲解:数三角(枚举+STL)
二、正解代码
1、C++
#include<bits/stdc++.h>
#define int long long
using namespace std;
signed main(){
int n; cin >> n;
vector<array<int,2>>a(n);
map<pair<int,int>, int>node;
for(int i = 0; i < n; i ++) {
cin >> a[i][0] >> a[i][1];
node[{a[i][0], a[i][1]}] ++;
}
int ans = 0;
for(int i = 0; i < n; i ++) {
map<int,vector<int>>st;
for(int j = 0; j < n; j ++) {
int dis = (a[i][0] - a[j][0]) * (a[i][0] - a[j][0]) + (a[i][1] - a[j][1]) * (a[i][1] - a[j][1]);
if(dis)st[dis].push_back(j);
}
for(auto x: st) {
vector<int>&no = x.second;
int sum = no.size();
ans += sum * (sum - 1) / 2;
int del = 0;
for(int j = 0; j < no.size(); j ++) {
int x1 = a[i][0], y1 = a[i][1];
int x2 = a[no[j]][0], y2 = a[no[j]][1];
int x3 = x1 * 2 - x2, y3 = y1 * 2 - y2;
del += (node[{x3, y3}]);
}
ans -= (del / 2);
}
}
cout << ans << endl;
return 0;
}
2、python3
n = int(input())
a = [list(map(int, input().split())) for i in range(n)]
node = {}
for x, y in a:
key = (x, y)
if key not in node:
node[key] = 1
else:
node[key] += 1
ans = 0
dis = [[0] * n for i in range(n)]
for i in range(n):
for j in range(i + 1, n):
x1, y1 = a[i]
x2, y2 = a[j]
d = (x1 - x2) ** 2 + (y1 - y2) ** 2
dis[i][j] = d
dis[j][i] = d
st = {}
for i in range(n):
st.clear()
x1, y1 = a[i]
for j in range(n):
if dis[i][j]:
if dis[i][j] not in st:
st[dis[i][j]] = [j]
else:
st[dis[i][j]].append(j)
for d,no in st.items():
sum = len(no)
ans += sum * (sum - 1) // 2
dell = 0
for j in no:
x2, y2 = a[j]
x3 = x1 * 2 - x2
y3 = y1 * 2 - y2
if (x3, y3) in node:
dell += node[(x3, y3)]
ans -= (dell // 2)
print(ans)
3、Java
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
List<int[]> a = new ArrayList<>();
Map<String, Integer> node = new HashMap<>();
for(int i = 0; i < n; i ++) {
int x = sc.nextInt();
int y = sc.nextInt();
a.add(new int[]{x, y});
String no = x + "#" + y;
node.put(no, node.getOrDefault(no, 0) + 1);
}
long ans = 0;
for(int i = 0; i < n; i ++) {
Map<Long, List<Integer>> st = new HashMap<>();
for(int j = 0; j < n; j ++) {
int x1 = a.get(i)[0], y1 = a.get(i)[1];
int x2 = a.get(j)[0], y2 = a.get(j)[1];
long dis = (long)Math.pow(x1 - x2, 2) + (long)Math.pow(y1 - y2, 2);
if(dis == 0)continue;
if(st.get(dis) == null)
st.put(dis, new ArrayList<Integer>());
st.get(dis).add(j);
}
for(Map.Entry<Long, List<Integer>> x: st.entrySet()){
List<Integer>no = x.getValue();
long sum = no.size();
ans += sum * (sum - 1) / 2;
long del = 0;
for(int j = 0; j < no.size(); j ++) {
int x1 = a.get(i)[0], y1 = a.get(i)[1];
int x2 = a.get(no.get((j)))[0], y2 = a.get(no.get((j)))[1];
int x3 = x1 * 2 - x2, y3 = y1 * 2 - y2;
if(node.get(x3 + "#" + y3) != null)
del += node.get(x3 + "#" + y3);
}
ans -= del / 2;
}
}
System.out.println(ans);
}
} }
}