题目大意:
给定1000个点,求有多少组4个点可以形成平行四边形
这里可以找到一个特别关键的点在于如果能形成平行四边形,2个点的中点必然相交
那么只要将所有点的中点都计算出来,然后排个序计算出现的次数即可,这里算中点可能会出现小数,可以直接不除以2,这样是中点的2倍也没问题
1 #include <cstdio> 2 #include <cstring> 3 #include <iostream> 4 #include <string> 5 #include <algorithm> 6 #include <vector> 7 #include <map> 8 #include <stack> 9 #include <iomanip> 10 using namespace std; 11 #define N 1005 12 #define MOD 10007 13 #define ll long long 14 15 struct Point{ 16 int x , y; 17 bool operator<(const Point &m) const{ 18 return x<m.x || (x==m.x&&y<m.y); 19 } 20 bool operator==(const Point &m) const{ 21 return x==m.x&&y==m.y; 22 } 23 }p[N] , tmp[N*N]; 24 25 map<Point , int> m; 26 27 int solve(int k) 28 { 29 sort(tmp , tmp+k); 30 int ret = 0 , cur=1; 31 for(int i=1 ; i<k ; i++){ 32 if(!(tmp[i]==tmp[i-1])){ 33 ret += cur*(cur-1)/2; 34 cur = 1; 35 } 36 else cur++; 37 } 38 return ret; 39 } 40 41 int main() 42 { 43 #ifndef ONLINE_JUDGE 44 freopen("a.in" , "r" , stdin); 45 #endif // ONLINE_JUDGE 46 int T; 47 scanf("%d" , &T); 48 while(T--) 49 { 50 int n; 51 scanf("%d" , &n); 52 for(int i=0 ; i<n ; i++) 53 scanf("%d%d" , &p[i].x , &p[i].y); 54 int k=0; 55 for(int i=0 ; i<n ; i++){ 56 for(int j=i+1 ; j<n ; j++){ 57 Point t; 58 t.x = p[i].x+p[j].x; 59 t.y = p[i].y+p[j].y; 60 tmp[k++] = t; 61 } 62 } 63 printf("%d\n" , solve(k)); 64 } 65 return 0; 66 }
我还在坚持,我还未达到我所想,梦~~一直在