切蛋糕
有一个圆形蛋糕,圆心座标为(xc,yc),半径为R。座标系中有一些草莓。现在要沿圆心切出半个蛋糕,使得包含草莓最多。落在蛋糕边界上也算是包含。
输入格式
单组测试数据。 第一行有三个浮点数,分别表示xc,yc,R。 第二行有一个整数n(1<=n<=200),表示草莓的数目。 接下来n行,每一行两个浮点数,表示草莓的座标xi,yi。 所有草莓的座标不一样,以上所有浮点数都在0到2000之间。
输出格式
输出一个整数,表示最多能包含的草莓的数目。
输入样例
T1
25 25 3.5
7
25 28
23 27
27 27
24 23
26 23
24 29
26 29
T2
350 200 2.0
5
350 202
350 199
350 198
348 200
352 200
输出样例
T1
3
T2
4
T2图
思路
1.枚举每个点a恰好在直径上
2.枚举每个点b
(1)判断在圆内
(2)用叉积判断是由点a所在的半径由顺时针还是逆时 针旋转经过(0-180)
(3)分别统计顺时针和逆时针个数
代码
#include<bits/stdc++.h>
using namespace std;
double xc,yc,R,x[205],y[205];
int n,sum1,sum2,ma;
bool check(double a,double b){//圆内
return a*a+b*b<=R*R;
}
double xj(double a,double b,double c,double d){//叉积
return a*d-b*c;
}
int main(){
scanf("%lf%lf%lf",&xc,&yc,&R);
scanf("%d",&n);
for(int i=1;i<=n;i++)
scanf("%lf%lf",&x[i],&y[i]);
for(int i=1;i<=n;i++){
sum1=sum2=0;
for(int j=1;j<=n;j++)
if(check(x[j]-xc,y[j]-yc)){
if(xj(x[i]-xc,y[i]-yc,x[j]-xc,y[j]-yc)>=0)
sum1++;
if(xj(x[i]-xc,y[i]-yc,x[j]-xc,y[j]-yc)<=0)
sum2++;
}
ma=max(ma,max(sum1,sum2));
}
printf("%d",ma);
}