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;}
阅读全文
0 0
- hdu
- hdu
- HDU
- hdu ()
- hdu
- hdu
- HDU
- HDU
- hdu
- hdu
- HDU
- Hdu
- hdu
- hdu-
- hdu
- hdu
- hdu
- HDU
- 总结
- HDU
- 【ADO】浅识“EOF与BOF”
- MOOC清华《面向对象程序设计》第3章编程题第1题:重载函数运算符以封装排序算法
- ES6之-字符串的新特性
- HDU
- 人生苦短,少打游戏
- 分支结构(switch)
- HDU CCPC 1005 CaoHaha's staff
- 跨域资源共享 CORS 详解
- //将一个ANSI编码格式纯文本文件以UTF-8的形式读到另一个文件中去
- MySQL初学学习的一点细节上小经验记载
- nyoj 开心的小明 动态规划 01背包
- Luogu P1282 多米诺骨牌