You are given a point set with nnn points on the 2D-plane, your task is to find the smallest number of points you need to add to the point set, so that all the points in the set are center symmetric.
All the points are center symmetric means that you can find a center point (Xc,Yc)(X_c,Y_c)(Xc,Yc)(not necessarily in the point set), so that for every point (Xi,Yi)(X_i,Y_i)(Xi,Yi) in the set, there exists a point (Xj,Yj)(X_j,Y_j)(Xj,Yj) (iii can be equal to jjj) in the set satisfying Xc=(Xi+Xj)/2X_c=(X_i+X_j)/2Xc=(Xi+Xj)/2 and Yc=(Yi+Yj)/2Y_c=(Y_i+Y_j)/2Yc=(Yi+Yj)/2.
Input
The first line contains an integer n(1≤n≤1000)n(1 \le n \le 1000)n(1≤n≤1000).
The next nnn lines contain nnn pair of integers (Xi,Yi)(X_i,Y_i)(Xi,Yi) (−106≤Xi,Yi≤106)(-10^6 \le X_i,Y_i \le 10^6)(−106≤Xi,Yi≤106) -- the points in the set
Output
Output a single integer -- the minimal number of points you need to add.
样例输入
3 2 0 -3 1 0 -2
样例输出
1
样例解释
For sample 111, add point (5,−3)(5,-3)(5,−3) into the set, the center point can be (1,−1)(1,-1)(1,−1) .
题意:给你n个点的坐标,问最少再添加多少个点才能使所以点都关于某一点中心对称
思路:枚举中心点(每两个点都有一个中心点),看每个中心点有多少个点关于他对称,纪录最多的那个点,又由于有一些点可能正好位于中心点的位置,这要预先纪录
#include<stdio.h>
#include<math.h>
#include<vector>
#include<cstring>
#include<queue>
#include<iostream>
#include<algorithm>
#include<map>
using namespace std;
typedef pair<int,int> p;
map<pair<int,int>,int>mp;
map<pair<int,int>,int>mp2;
int a[1002],b[1002];
int main(){
int n;
scanf("%d",&n);
int ans = 0;
for(int i = 1; i <= n; i++){
scanf("%d%d",&a[i],&b[i]);
mp2[p(a[i],b[i])]++;
}
double ansx,anxy;
for(int i = 1; i <= n; i++)
for(int j = i+1; j <= n; j++){
int x = a[i]+a[j];
int y = b[i]+b[j];
mp[p(x,y)]++;
if(x%2==0&&y%2==0){
if(ans<2*mp[p(x,y)]+mp2[p(x/2,y/2)]){
ans=2*mp[p(x,y)]+mp2[p(x/2,y/2)];
}
}
else{
if(ans<2*mp[p(x,y)]){
ans=2*mp[p(x,y)];
}
}
}
if(n == 1) printf("0\n");
else
printf("%d\n",n-ans);
}