题意:
给n个点,求最多多少个点共圆且该圆过原点。
三个不共线的点即可确定一个圆。利用圆心公式,直接枚举两个点与圆点求圆心,圆心最多的就是答案,圆心公式直接套的板子。
#include<iostream>
#include<math.h>
#include<map>
using namespace std;
const int N=2e3+10;
double eps=1e-10;
map<pair<double,double>,int>m;
struct point{
double x,y;
}p[N];
double X,Y;
void Circle_center(point p1,point p2,point p3){
double a = p1.x - p2.x;
double b = p1.y - p2.y;
double c = p1.x - p3.x;
double d = p1.y - p3.y;
double e = ((p1.x * p1.x - p2.x * p2.x) + (p1.y * p1.y - p2.y * p2.y)) / 2.0;
double f = ((p1.x * p1.x - p3.x * p3.x) + (p1.y * p1.y - p3.y * p3.y)) / 2.0;
double det = b * c - a * d;
if (fabs(det) < eps) {
X=Y=0;
return ;
}
X = -(d * e - b * f) / det;
Y = -(a * f - c * e) / det;
return ;
}
int main(){
int n,ans=0;
point p0;
p0.x=p0.y=0;
scanf("%d",&n);
for(int i=0;i<n;i++)
scanf("%lf%lf",&p[i].x,&p[i].y);
for(int i=0;i<n;i++){
m.clear();
for(int j=i+1;j<n;j++){
if((p[i].x*p[j].y-p[j].x*p[i].y)==0) continue;
Circle_center(p0,p[i],p[j]);
m[{X,Y}]++;
ans=max(ans,m[{X,Y}]);
}
}
printf("%d",ans+1);
return 0;
}