sort之结构体排序2

fzu2231 平行四边形数
Problem Description

在一个平面内给定n个点,任意三个点不在同一条直线上,用这些点可以构成多少个平行四边形?一个点可以同时属于多个平行四边形。

Input

多组数据(<=10),处理到EOF。

每组数据第一行一个整数n(4<=n<=500)。接下来n行每行两个整数xi,yi(0<=xi,yi<=1e9),表示每个点的坐标。

Output

每组数据输出一个整数,表示用这些点能构成多少个平行四边形。

Sample Input

4
0 1
1 0
1 1
2 0
Sample Output

1

只想说,训练赛的时候,刚开始以为是水题,根据定义去计算,画图搞了好久。后面竟然以为是递归找规律类。后来就这样没了;一直没有做出来。到了后面才知道方法。
求出所有两点的中点然后在去找中点是否相同,之后就要用到排列组合;
在查找中点是否相同,这里就要排序一下,不然就会爆了。

#include<stdio.h>
#include<iostream>
#include<algorithm>

using namespace std; 

struct di
{
    int x;
    int y;
}p[510],zp[250010];

bool cmp(di a , di b)
{
    if(a.x!=b.x)    return a.x < b.x;
    else    return a.y < b.y; 
}
int main()
{
    int n, l, i, j, num, k;
    while(scanf("%d",&n) != EOF){
        for(i = 0; i < n; i++){
            scanf("%d %d",&p[i].x, &p[i].y);
        }
        l = 0;
        for(i = 0; i < n-1; i++){
            for(j = i+1; j < n; j++){
                zp[l].x = (p[i].x+p[j].x);
                zp[l].y = (p[i].y+p[j].y);//不能除以2; 
                l++;
            }
        }
        sort(zp, zp+l, cmp);
        k = 1;
        num = 0;
        for(i = 1; i < l; i++){
            if(zp[i].x==zp[i-1].x && zp[i].y==zp[i-1].y){
                k++;
            }
            else{
                num += (k*(k-1)/2);
                k = 1;
            }
        }
        printf("%d\n",num);
    }

    return 0 ;
} 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值