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;
}
时间: 2024-10-14 20:24:27

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

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

Problem A Calculus Midterm 题意:略 题解:~~ Problem B 翻翻棋 题意:略 题解:~~ Problem C 平行四边形数 题意:略 题解:~~ Problem D 炉石传说 题意:略 题解:最直接的一个做法就是二分图,跑一遍判断是否匹配的数量为n.还可以的一个做法是贪心:先把对手的血量从大到小排,然后对于自己,选一个能满足对方攻击的自身攻击力最小的一个随从,然后不断重复,最后判断有无可选即可. 1 /*zhen hao*/ 2 #include <cstdi

福州大学第十三届程序设计竞赛_重现总结

 Problem C 平行四边形数 Accept: 82    Submit: 425 Time Limit: 2000 mSec    Memory Limit : 32768 KB  Problem Description 在一个平面内给定n个点,任意三个点不在同一条直线上,用这些点可以构成多少个平行四边形?一个点可以同时属于多个平行四边形.  Input 多组数据(<=10),处理到EOF. 每组数据第一行一个整数n(4<=n<=500).接下来n行每行两个整数xi,yi(0<

FZU 2231 平行四边形数

FZU - 2231  平行四边形数 题目大意:给你n个点,求能够组成多少个平行四边形? 首先想到的是判断两对边平行且相等,但这样的话得枚举四个顶点,或者把点转换成边然后再枚举所有边相等的麻烦,还不好处理.这时我们就得想到另一个性质,对角线互相平分,这样我们只需枚举对角线,转换一下就是中点.因为给出的点不存在三点共线的,那么我们处理每两个点的中点,如果中点相等,那么说明这两条线互相平分,也就可以组成平行四边形. 1 #include<cstdio> 2 #include<algorith

福州大学第十届程序设计竞赛 -- 部分题解

题目传送:福州大学第十届程序设计竞赛 Problem A 神庙逃亡 水题 AC代码: #include<cstdio> #include<cmath> #include<iostream> using namespace std; int s, h, vx, vy; int main() { int w; cin >> w; while(w--){ cin >> s >> h >> vx >> vy; long

东南大学第十三届程序设计竞赛初赛题解

问题 A: 天梯评分系统 题目描述 在一个下雨的日子,沈学姐和四个好基友约定无事一同打dota(dota是一个5对5的MOBA类游戏)因为想证明谁最NB,他们就全部注册新号去爬天梯了.天梯有一套完整的评分系统,它可以根据每位选手每局的数据进行评分,因为dota的英雄既有辅助又有ganker还有后期,所以不同的英雄的评分标准不一样.可惜那天天梯服务器维护,无法进行评分.于是,他们记录下每一局的数据,找你来帮忙,希望你能够帮他们仿照天梯编一个评分系统,以便于他们比较谁是真正的神牛. 已知对于每个账号

2018年长沙理工大学第十三届程序设计竞赛 E 小木乃伊到我家

题目描述 AA的欧尼酱qwb是个考古学家,有一天qwb发现了只白白圆圆小小的木乃伊,它是个爱哭鬼却很努力.qwb想把这么可爱的小木乃伊送给AA,于是便找上了快递姐姐,这下可让快递姐姐犯愁了,因为去往AA家的路实在太难走了(甚至有可能没有路能走到AA家),快递姐姐找上聪明的ACMer,想请你帮忙找出最快到达AA家的路,你行吗? 输入描述: 第一行输入两个整数n和m(2<=n<=m<=200000),分别表示有n座城市和m条路,城市编号为1~n(快递姐姐所在城市为1,AA所在城市为n).接下

福州大学第十二届程序设计竞赛 (部分题解)

比赛链接:http://acm.fzu.edu.cn/contest/list.php?cid=144 Problem B 完美的数字 Time Limit: 1000 mSec    Memory Limit : 32768 KB Problem Description Bob是个很喜欢数字的孩子,现在他正在研究一个与数字相关的题目,我们知道一个数字的完美度是 把这个数字分解成三个整数相乘A*A*B(0<A<=B)的方法数,例如数字80可以分解成1*1*80,2*2*20 ,4*4*5,所以

2015.10.19 福州大学第九届程序设计竞赛

FZU 2086 餐厅点餐 枚举 练的时候以为是dp---(事实上这场只做了10来分钟---就愉快地滚去吃饭了---) 1 #include<cstdio> 2 #include<cstring> 3 #include<iostream> 4 #include<algorithm> 5 using namespace std; 6 int A,B,C,D,E; 7 int a[15];//汤 8 int b[15];//饭 9 int c[15];//面 1

福州大学第十二届程序设计竞赛题解

A:这题利用单调栈,先预处理出每个位置向下的最远位置,那么每一行单独考虑,每行就相当于一些段的子矩阵个数,利用单调栈维护,每次出栈的时候把大于当前要入栈(高度0的不入栈了)的段的部分计算出来,累加一下答案即可 B:这题可以枚举,因为一个10^15开3方之后是10^5枚举起来是没有问题的,然后枚举一个数字i,等于要计算在max(a, i * i * i)到min(i * i * i, b)区间,有多少个x满足i * i * x在区间内,两边除下减下就能计算出答案了 C:并查集,注意每次合并的时候都