在一个平面内给定n个点,任意三个点不在同一条直线上,用这些点可以构成多少个平行四边形?一个点可以同时属于多个平行四边形。
多组数据(<=10),处理到EOF。
每组数据第一行一个整数n(4<=n<=500)。接下来n行每行两个整数xi,yi(0<=xi,yi<=1e9),表示每个点的坐标。
每组数据输出一个整数,表示用这些点能构成多少个平行四边形。
4 0 1 1 0 1 1 2 0
1代码
#include<cstdio> #include<iostream> #include<algorithm> using namespace std; struct midxy { int a,b; }mid[250000]; bool cmp(midxy A,midxy B) { if(A.a!=B.a) return A.a<B.a; else return A.b<=B.b; } int main() { int n; while(~scanf("%d",&n)) { int x[505],y[505],k=0,i,j; for(i=0;i<n;i++) scanf("%d %d",&x[i],&y[i]); for(i=0;i<n;i++) { for(j=i+1;j<n;j++) { mid[k].a=x[i]+x[j]; mid[k].b=y[i]+y[j]; k++; } } sort(mid,mid+k,cmp); int sum=1,cc=0; for(i=0;i<k-1;i++) { if(mid[i].a==mid[i+1].a&&mid[i].b==mid[i+1].b) { sum++; }else { cc+=sum*(sum-1)/2; sum=1; } } printf("%d\n",cc); } return 0; }