fzu 2231,N个点求构成的平行四边行个数。 题意简重点在优化上

 1 #include <cstdio>
 2 #include <iostream>
 3 #include <cstring>
 4 #include <algorithm>
 5 #include <cmath>
 6 #include <vector>
 7 #include <map>
 8 
 9 using namespace std;
10 const int maxn = 510;
11 
12 struct node
13 {
14     int x,y;
15 }point[maxn];
16 
17 vector<pair<double,double> >vec;
18 
19 int n;
20 
21 bool cmp(pair<double,double>a,pair<double,double>b)
22 {
23     if(a.first==b.first){
24         return a.second<b.second;
25     }
26     return a.first<b.first;
27 }
28 
29 int main()
30 {
31     int n;
32     while(~scanf("%d",&n))
33     {
34         vec.clear();
35         for(int i=0;i<n;i++)
36         {
37             scanf("%d%d",&point[i].x,&point[i].y);
38         }
39         for(int i=0;i<n;i++)
40         {
41             for(int j=i+1;j<n;j++)
42             {
43                 double xx=(point[i].x+point[j].x)/2.;
44                 double yy=(point[i].y+point[j].y)/2.;
45                 vec.push_back(make_pair(xx,yy));
46             }
47         }
48         int ans=0;
49         int num=1;
50         sort(vec.begin(),vec.end(),cmp);
51         for(int i=1;i<vec.size();i++){
52             if(vec[i].first==vec[i-1].first&&vec[i].second==vec[i-1].second){
53                 num++;
54             }
55             else{
56                 ans+=(num*(num-1)/2);
57                 num=1;
58             }
59         }
60         printf("%d\n",ans);
61     }
62 
63     return 0;
64 }
View Code