zoukankan      html  css  js  c++  java
  • 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 } 
    爱的四边形平平行
  • 相关阅读:
    第08组 Alpha冲刺 (6/6)
    第08组 Alpha冲刺 (5/6)
    第08组 Alpha冲刺 (4/6)
    第08组 Alpha冲刺 (3/6)
    第08组 Alpha冲刺 (2/6)
    第08组 Alpha冲刺 (1/6)
    第一次编程作业
    第01组 Alpha冲刺(6/6)(组长)
    第01组 Alpha冲刺总结(组长)
    第01组 Alpha冲刺 (5/6)(组长)
  • 原文地址:https://www.cnblogs.com/LMCC1108/p/10520346.html
Copyright © 2011-2022 走看看