FZU 2231 平行四边形数

Posted lmcc1108

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了FZU 2231 平行四边形数相关的知识,希望对你有一定的参考价值。

FZU - 2231   平行四边形数

  题目大意:给你n个点,求能够组成多少个平行四边形?

  首先想到的是判断两对边平行且相等,但这样的话得枚举四个顶点,或者把点转换成边然后再枚举所有边相等的麻烦,还不好处理。这时我们就得想到另一个性质,对角线互相平分,这样我们只需枚举对角线,转换一下就是中点。因为给出的点不存在三点共线的,那么我们处理每两个点的中点,如果中点相等,那么说明这两条线互相平分,也就可以组成平行四边形。

技术图片
 1 #include<cstdio>
 2 #include<algorithm>
 3 using namespace std; 
 4 const int N=520;
 5 struct Node{
 6     double x,y;
 7 }p[N],zp[N*N];
 8 bool cmp(const Node &n1,const Node &n2){
 9     return n1.x==n2.x ? n1.y<n2.y : n1.x<n2.x; 
10 }
11 int main()
12 {
13     int n,m;
14     while(~scanf("%d",&n))
15     {
16         for(int i=0;i<n;i++)
17             scanf("%lf%lf",&p[i].x,&p[i].y);
18         m=0;
19         for(int i=0;i<n;i++)
20             for(int j=i+1;j<n;j++)
21             {
22                 zp[m].x=(p[i].x+p[j].x)/2;
23                 zp[m++].y=(p[i].y+p[j].y)/2;
24             }
25         sort(zp,zp+m,cmp);
26         int ans=0;
27         zp[m].x=-1,zp[m].y=-1;
28         for(int i=0,j=0;i<=m;i++)
29         {
30             if(i&&(zp[i].x!=zp[i-1].x||zp[i].y!=zp[j].y))
31             {
32                 ans+=(i-j)*(i-j-1)/2;
33                 j=i;
34             }//中点相等的边两两可以组成一个平行四边形 
35         }
36         printf("%d
",ans);
37     }
38     return 0;
39 } 
爱的四边形平平行

 

以上是关于FZU 2231 平行四边形数的主要内容,如果未能解决你的问题,请参考以下文章

Lucas组合数定理组合-FZU 2020

fzu 2184 逆序数还原

Axial symmetry FZU - 2035

fzu 2105 Digits Count 线段树

片段着色器中未使用纹理数据 - OpenGL

FZU - 2204 简单环形dp