平行四边形数 FZU 2231 计算数学

平行四边形数

Time Limit:2000MS    Memory Limit:32768KB    64bit IO Format:%I64d & %I64u

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 <iostream>
#include <cstdlib>
using namespace std;
#define N 1000000
struct Node
{
    int x, y;
}p[N];

struct node
{
    int x, y;
}a[N];
int cmp(const void *m,const void *n);

int main()
{
    int n;
    while(cin>>n)
    {
        for(int i=0;i<n;i++)
        {
            cin>>p[i].x>>p[i].y;
        }
        int cnt=0;
        for(int i=0;i<n;i++)
        {
            for(int j=i+1;j<n;j++)
            {
                a[cnt].x=(p[i].x+p[j].x);//虽然是中点但要避免INT的数值取整问题,可以不除于二代替
                a[cnt].y=(p[i].y+p[j].y);
                cnt++;
            }
        }
        qsort(a,cnt,sizeof(a[0]),cmp);
        int num=1, sum=0;
        for(int i=1;i<cnt;i++)
        {
            if(a[i].x==a[i-1].x&&a[i].y==a[i-1].y)
            {
                num++;
            }
            else
            {
                sum+=(num*(num-1))/2;
                num=1;
            }
        }
        if(num!=1)
        {
            sum+=(num*(num-1))/2;//组合数学
        }
        cout<<sum<<endl;
    }
    return 0;
}

int cmp(const void *m,const void *n)
{
    struct node *o=(struct node *)m;
    struct node *q=(struct node *)n;
    if(o->x>q->x)
    {
        return 1;
    }
    else if(o->x==q->x&&o->y>q->y)
    {
        return 1;
    }
    else
    {
        return -1;
    }
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值