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 }