##切蛋糕

切蛋糕

有一个圆形蛋糕,圆心座标为(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);
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值