题意:给定平面上的n个点,求这n个点中能构成平行四边形的个数。
保证不会有四个点在同一条直线上。
解题思路:由于平行四边形的两条对角线交于一点,且该点为两对角线的中点。若两线段的中点是同一个点,则这两条线段的四个顶点一定可以构成一个平行四边形!
所以可以求所有线段的中点,然后根据相同中点的个数来判断平行四边形的个数。如果一个点重复了k次,则形成的平行四边形的个数为k(k-1)/2.
1 //Accepted 16888 KB 980 ms
2 #include <cstdio>
3 #include <cstring>
4 #include <cmath>
5 #include <algorithm>
6 using namespace std;
7 const int MAXN = 1005;
8 int n;
9 struct node
10 {
11 double x,y;
12 }p[MAXN*MAXN],e[MAXN];
13 int num;
14 void pre()
15 {
16 for (int i=0;i<n;i++)
17 {
18 scanf("%lf%lf",&e[i].x,&e[i].y);
19 }
20 for (int i=0;i<n;i++)
21 {
22 for (int j=i+1;j<n;j++)
23 {
24 p[num].x=(e[i].x+e[j].x)/2;
25 p[num++].y=(e[i].y+e[j].y)/2;
26 }
27 }
28 }
29 int cmp(struct node x,struct node y)
30 {
31 if (x.x==y.x)
32 {
33 return x.y<y.y;
34 }
35 else
36 return x.x<y.x;
37 }
38 int slove()
39 {
40 int ans=0;
41 sort(p,p+num,cmp);
42 int temp=1;
43 struct node pp=p[0];
44 for (int i=1;i<num;i++)
45 {
46 if (p[i].x==pp.x && p[i].y==pp.y)
47 {
48 temp++;
49 }
50 else
51 {
52 ans+=temp*(temp-1)/2;
53 pp.x=p[i].x;
54 pp.y=p[i].y;
55 temp=1;
56 }
57 }
58 return ans;
59 }
60 int main()
61 {
62 int T;
63 scanf("%d",&T);
64 for (int t=1;t<=T;t++)
65 {
66 scanf("%d",&n);
67 num=0;
68 pre();
69 printf("Case %d: %d\n",t,slove());
70 }
71 return 0;
72 }
poj1971Parallelogram Counting,布布扣,bubuko.com
时间: 2024-10-12 04:35:42