HDU 1943 Ball bearings(简单计算几何)
现在给出一个大圆圈,然后在大圆圈里面要放多个小圆圈,且要求所有的小圆圈必须与大圆圈的内表面相切,且依序相邻的两个小圆圈之间的距离要大于等于给定值s。
输入:首先是一个t,表示输入实例数。以下每行是一个实例,有3个浮点正数,D,d,s。D是大圆的直径,d是小圆的直径,s是依序相邻的小圆之间的最小距离。所有参数都是在[0.0001, 500.0]范围内。
输入保证大圆中至少可以放3个小圆。
输出:对于每个实例,输出大圆中可以放的小圆数目的最大值。
分析:本题中保证大圆中至少可以放3个小圆,则保证了只要相邻的小圆之间的距离大于等于s,则任意小圆不相切。
其实所有小圆的圆心都在同一个圆圈上(如上图红线所示),相邻的两个小圆之间的距离就是它们圆心距,即红线圆的一根弦长L,只要求出这跟弦对应的圆心x,则最多可以放小圆的个数为2π/x的下取整。
弦长L= d+s,红圆直径R=D-d,则L对应的圆心角为2*asin(L/R)
AC代码:
#include<cstdio> #include<cmath> using namespacestd; #define pi acos(-1.0) //π int main() { int t; while(scanf("%d",&t)==1&&t )//实例个数 { while(t--) { double D,d,s,L,R,c;//L为弦长,R为红圆直径,c为弦L对应的圆心角 scanf("%lf%lf%lf",&D,&d,&s); L=d+s; R=D-d; c=2*asin(L/R); int max_num = (int)(2.0*pi/c); printf("%d\n",max_num); } } return 0; }