2020牛客暑期多校训练营(第二场) Boundary
题目大意:
给你n个点,问最多有多少个点在同一个圆的边界,要求原点也必须在这个圆上。
题解:
这个题目我就是看的题解写的,所以直接看题解吧。【题解】2020牛客暑假多校训练营(第二场)
需要注意的就是 判断角度是否一样需要用 (fabs(x-y)<eps) 这个(eps=1e-10) 这样才能过,如果 (eps=1e-6) 只能过 (85\%) ,如果 (eps=1e-8) 只能过 (90\%)
#include <bits/stdc++.h>
#define debug(x) printf("debug:%s=%d
",#x,x);
//#define debug(x) cout << #x << ": " << x << endl
using namespace std;
const int maxn = 2e3+10;
const double eps = 1e-10;
typedef long long ll;
ll x[maxn],y[maxn];
double ans[maxn];
double getLen(int i,int j){
double res = (x[j]-x[i])*(x[j]-x[i])+(y[j]-y[i])*(y[j]-y[i]);
return sqrt(res);
}
double getCos(int i,int j,int k){
double c = getLen(i,j);
double a = getLen(j,k);
double b = getLen(i,k);
return acos((a*a+b*b-c*c)/(2*a*b));
}
int main(){
int n;
scanf("%d",&n);
for(int i=1;i<=n;i++) scanf("%lld%lld",&x[i],&y[i]);
x[0]=y[0]=0;
int sum = 1;
for(int i=1;i<=n;i++) {
int now = 0;
for (int j = 1; j <= n; j++) {
ll num = x[i] * y[j] - x[j] * y[i];
if (num >= 0) continue;
double res = getCos(0, i, j);
// printf("i=%d j=%d res=%f
",i,j,res);
ans[++now] = res;
}
int cnt = 2;
if (now) {
sum = max(sum, 2);
sort(ans + 1, ans + 1 + now);
for (int j = 2; j <= now; j++) {
if (ans[j] - ans[j - 1] < eps) {
cnt++, sum = max(sum, cnt);
} else cnt = 2;
}
}
}
printf("%d
",sum);
}
/*
5
3 3
8 6
8 8
1 3
4 2
*/