HDU

来源:互联网 发布:淘宝店铺网名昵称大全 编辑:程序博客网 时间:2024/06/06 00:16

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6158

题目大意:一个大圆和一个小圆相切,根据图中的例子画圆,求画到第n个的总面积

题目思路:用到了圆的反演,然后根据反演的性质可以把小圆的半径都求出来,不知道圆的反演,可以参考http://blog.csdn.net/nightmare_ak/article/details/77073899
求的过程:
这里写图片描述
超大圆是反演圆,O是反演圆心,II是大圆,直线VII是其反演后的图像,I是小圆,直线VIII是其反演后的图像,V是III反演后的图像,VI是IV反演后的图像

AC代码:

#include<cstdio>#include<cmath>#include<algorithm>using namespace std;double PI = acos(-1);int main(){    double Pr = 1000000;//反演圆半径,随便取,越大越好    int t;scanf("%d", &t);    while (t--)    {        double smallR, bigR;        scanf("%lf%lf", &smallR, &bigR);        if (smallR > bigR)        {            double kk = smallR;            smallR = bigR;            bigR = kk;        }        int n;scanf("%d", &n);        double smallD = Pr*Pr / 2 / bigR, bigD = Pr*Pr / 2 / smallR;        double mediumD = (smallD + bigD) / 2;        double R = mediumD - smallD;        double sum = 0, height, OC2, rr;        double horR = bigR - smallR;        if (n == 1)            printf("%.5f\n", horR*horR*PI);        else if (n % 2)        {            for (int i = 1;i <= min((n - 1) / 2,60000);++i)            {                height = 2 * R*i;                rr = Pr*Pr * R / (mediumD*mediumD + height*height - R*R);                sum = sum + rr * rr * PI;            }            printf("%.5f\n", horR*horR*PI + sum * 2);        }        else        {            for (int i = 1;i <= min(n / 2,60000);++i)//卡时间,因为到达一定值后面积变化可忽略不计,所以直接提前结束            {                height = 2 * R*i;                rr = Pr*Pr * R / (mediumD*mediumD + height*height - R*R);                if (i <= (n - 2) / 2)                    sum = sum + rr * rr * PI;            }            printf("%.5f\n", rr * rr * PI + horR*horR*PI + sum * 2);        }    }    return 0;}
原创粉丝点击