欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

B题Boundary

程序员文章站 2022-04-02 18:49:19
...

题目理解

给定n个点,然后一个坐标原点,要求一个过原点的圆经过最多的给定的点,输出最多的个数

解题思路

先枚举每个点,然后再枚举其他的点,通过两条中垂线,求出圆心坐标,最后取众数

代码

#include<iostream>
#include<cstdio>
#include<map>
#include<cmath>
using namespace std;
typedef long double ld;
typedef pair<ld,ld> P;
P p[2010];
map<P,int> m;
P solve(ld x1,ld y1,ld x2,ld y2,ld x3,ld y3){
    return P((((y2-y1)*(y3*y3-y1*y1+x3*x3-x1*x1)-(y3-y1)*(y2*y2-y1*y1+x2*x2-x1*x1))/(2.0*((x3-x1)*(y2-y1)-(x2-x1)*(y3-y1)))),(((x2-x1)*(x3*x3-x1*x1+y3*y3-y1*y1)-(x3-x1)*(x2*x2-x1*x1+y2*y2-y1*y1))/(2.0*((y3-y1)*(x2-x1)-(y2-y1)*(x3-x1)))));//求出圆心坐标
}
int main(){
	int n,ans=0;
	scanf("%d",&n);
	for(int i=0;i<n;i++){
		cin>>p[i].first>>p[i].second;
	}
	for(int i=0;i<n;i++){
		m.clear();
		for(int j=i+1;j<n;j++){
			if(p[i].first*p[j].second-p[i].second*p[j].first==0) continue;
			P res=solve(0,0,p[i].first,p[i].second,p[j].first,p[j].second);
			m[res]++;
			ans=max(ans,m[res]);
		}
	}
	cout << ans+1;
	return 0;
}