HDU 1943 Ball bearings(简单计算几何)

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;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值