天天看點

HDU 1943 Ball bearings(簡單計算幾何)

HDU 1943 Ball bearings(簡單計算幾何)

現在給出一個大圓圈,然後在大圓圈裡面要放多個小圓圈,且要求所有的小圓圈必須與大圓圈的内表面相切,且依序相鄰的兩個小圓圈之間的距離要大于等于給定值s。

HDU 1943 Ball bearings(簡單計算幾何)

輸入:首先是一個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;
}