FZU-2231 平行四边形数 From 福州大学第十三届程序设计竞赛

FZU-Problem 2231 平行四边形数

Accept: 66 Submit: 210 Time Limit: 2000 mSec Memory Limit : 32768 KB

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
Source

福州大学第十三届程序设计竞赛

题意:
平行四边形判定:
1、两组对边分别平行的四边形是平行四边形(定义判定法);
2、一组对边平行且相等的四边形是平行四边形;
3、两组对边分别相等的四边形是平行四边形;
4、两组对角分别相等的四边形是平行四边形(两组对边平行判定);
5、对角线互相平分的四边形是平行四边形。
如果1-4th的话,500^4 四个for遍历~绝逼超了
所以排除,根据5th点,前提条件因为三个点不在同一条直线上,所以我们只要判断其中点就好了,
central point ->x(y) = (point->x1(y1) + point->x2 (y2) ) / 2
然后 对 central point 这个集合排序 取k对中点相同的,接下来,要做的就是计算k对有共同中点的点集(每个点集包含两个点)能组成多少个平行四边形,即组合数Ck(下)2(上),展开式为 k*(k-1)/2

#include"iostream"
#include"algorithm"
using namespace std;
struct node{        
    int x,y;
}p[510],cp[250010];
int cmp(node a,node b){
    if(a.x!=b.x){
        return a.x<b.x;
    }else{
        return a.y<b.y;
    }
}
int main(){

    int j,i,n,co,k,count;
    while(cin>>n){
        for(i=1; i<=n; i++){
            cin>>p[i].x>>p[i].y;
        }
        co = 0;
        for(i=1; i<=n-1; i++){
            for(j=i+1; j<=n; j++){
                cp[co].x = p[i].x + p[j].x;
                cp[co++].y = p[i].y + p[j].y;
            }
        }
        //从0 - co-1 
        sort(cp,cp+co,cmp);
        k = 1;
        count = 0;
        for(i=1; i<co; i++){
            if(cp[i].x==cp[i-1].x && cp[i].y==cp[i-1].y){
                k++;//k对中点相同的直线 
            }
            else{ //组合 Ck 2
                count += (k*(k-1)/2);
                k = 1; 
            }
        }
        cout<<count<<endl;

    }
    return 0;
}

你可能感兴趣的:(water,FZU)