平行四边形数

来源:互联网 发布:苹果ios7是什么软件 编辑:程序博客网 时间:2024/05/01 21:01

Description

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

Input

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

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

Output

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

Sample Input

40 11 01 12 0

Sample Output

1

题目解法:求出任意两个点的中点,因为题目中已经表明任意三个点不在一条直线上,所以中点相同的点中任选两个都能组成平行四边形。

#include<cstdio>#include<cstring>#include<algorithm>using namespace std;struct point{    int x,y;}point[500];struct node{    int zx,zy;}a[250000];bool cmp(node p,node q){    if(p.zx==q.zx){        return p.zy<q.zy;    }    else return p.zx<q.zx;}int main(){    int n;    while(~scanf("%d",&n)){        for(int i=0;i<n;i++){            scanf("%d%d",&point[i].x,&point[i].y);        }        int cnt=0;        for(int i=0;i<n-1;i++){            for(int j=i+1;j<n;j++){                a[cnt].zx=point[i].x+point[j].x;                a[cnt].zy=point[i].y+point[j].y;                cnt++;            }        }        sort(a,a+cnt,cmp);        int sum=0;        int num=1;        for(int i=1;i<cnt;i++){            if(a[i].zx==a[i-1].zx&&a[i].zy==a[i-1].zy){                num++;            }            else{                sum+=(num*(num-1)/2);                num=1;            }        }        printf("%d\n",sum);    }    return 0;}


0 0