Facebook Hacker Cup 2016 Qualification Round第一题

这个,题意就是,给一个图,让你找,两条线段的端点是一个,并且长度相同,这个为一组,然后就是找,有多少组这样的星系
题解这个就事这么回事,依次找距离,然后排序,排序就是找相同的距离的有cnt个,然后(cnt-1)*cnt就是得数,关键在于想到用排序,我一开始想的是map,但是不行。。。。。
会tle
最近好久没有刷题了,因为数学建模,希望我有一天能有足够的能力来拥抱爱我和我爱的人

#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
using namespace std;
const int MaxN = 2000 + 5;

struct node{
    int x , y;
}a[MaxN];
double dis[MaxN * MaxN];
long long ans = 0;
double Dis(int i , int j)
{
    double x = (a[i].x - a[j].x) * (a[i].x - a[j].x);
    double y = (a[i].y - a[j].y) * (a[i].y - a[j].y);
    return sqrt(x + y);
}
int main()
{
    int t , cnt = 1;
    scanf("%d", &t);
    while(t--){
        ans = 0;
        int n;
        scanf("%d",&n);
        for(int i = 1 ; i <= n ; i++){
            scanf("%d %d",&a[i].x , &a[i].y);
        }
        for(int i = 1 ; i <= n ; i++){
          //  printf("*");
            int tot = 0;
            for(int j = 1 ; j <= n ; j++){
                if(i != j) dis[++tot] = Dis(i , j);
            }
            sort(dis + 1 , dis + tot + 1);
            int cnt = 0;dis[0] = dis[1] ,dis[tot + 1] = -1;//计算后面的,前面那句是为了把cnt = 1;很巧妙
            for(int j = 1 ; j <= tot + 1 ; j++){
                if(dis[j] != dis[j - 1]) ans += cnt*(cnt - 1) / 2 , cnt = 1;
                else cnt++;
            }
        }
        printf("Case #%d: ",cnt++);
        printf("%lld\n",ans);
    }
}
/*
5
3
0 0
0 1
0 3
5
0 0
0 1
0 2
0 3
0 4
4
0 0
0 100
100 0
100 100
4
0 0
-3 4
0 5
-5 0
6
5 6
6 5
7 6
6 7
7 8
8 7
*/
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值