题目链接:https://vjudge.net/contest/28079#problem/Q
题目大意:题目描述很长很吓人,大概的意思就是有n个坐标代表n个人的位置,每个人听力都是一样的,每人发出一枪,然后每个人给出一个数字表示听到的枪响次数,汇总为结果,结果有很多种(因为不知道人的听力极限范围),问有几种一致的结果(每个人的答案都是不矛盾的)。
解题思路:就是判断一下人和人之间的距离有多少种+1,直接计算所有人之间距离排序去重+1就好了。
代码:
1 #include<iostream> 2 #include<cstdio> 3 #include<algorithm> 4 using namespace std; 5 const int N=700+5; 6 7 struct node{ 8 int x,y; 9 }a[N]; 10 11 int res[N*N]; 12 13 int dis(int i,int j){ 14 return (a[i].x-a[j].x)*(a[i].x-a[j].x)+(a[i].y-a[j].y)*(a[i].y-a[j].y); 15 } 16 17 int main(){ 18 int T; 19 scanf("%d",&T); 20 int cas=0; 21 while(T--){ 22 int n; 23 scanf("%d",&n); 24 for(int i=1;i<=n;i++){ 25 scanf("%d%d",&a[i].x,&a[i].y); 26 } 27 int cnt=0; 28 for(int i=1;i<=n-1;i++){ 29 for(int j=i+1;j<=n;j++){ 30 res[++cnt]=dis(i,j); 31 } 32 } 33 sort(res+1,res+cnt+1); 34 int ans=cnt; 35 for(int i=2;i<=cnt;i++){ 36 if(res[i]==res[i-1]) 37 ans--; 38 } 39 printf("Case %d: %d ",++cas,ans+1); 40 } 41 }