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 ",ans); 61 } 62 63 return 0; 64 }