码迷,mamicode.com
首页 > 其他好文 > 详细

FZU 2231 平行四边形数

时间:2019-03-12 23:55:04      阅读:180      评论:0      收藏:0      [点我收藏+]

标签:枚举   相等   struct   ret   origin   opened   class   int   多少   

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\n",ans);
37     }
38     return 0;
39 } 
爱的四边形平平行

 

FZU 2231 平行四边形数

标签:枚举   相等   struct   ret   origin   opened   class   int   多少   

原文地址:https://www.cnblogs.com/LMCC1108/p/10520346.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!