题目链接:
传送门
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#define ll long long
using namespace std;
const int N = 1e6;
int t, n, ans, ca, idx;
double d[N];
struct Nodes {
double x, y;
}nodes[1010];
//计算距离
double dis(double x1, double y1, double x2, double y2) {
return sqrt((x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2));
}
int main() {
scanf("%d", &t);
while(t--) {
idx = 0;
scanf("%d", &n);
for(int i = 0; i < n; i++) {
scanf("%lf%lf", &nodes[i].x, &nodes[i].y);
}
//存下每个点之间的距离
for(int i = 0; i < n; i++) {
for(int j = i + 1; j < n; j++) {
d[idx++] = dis(nodes[i].x, nodes[i].y, nodes[j].x, nodes[j].y);
}
}
ans = idx;
sort(d, d + idx);
//减去重复计算的距离
for(int i = 1; i < idx; i++) if(d[i] == d[i - 1]) ans--;
printf("Case %d: %d\n", ++ca, ans + 1);
}
return 0;
}
这道其实就是算所有点之间的距离,然后算出距离长度不同的距离数量即可。
本题用set好像会超时……