题目描述
给定两个实数:
- BBB:等腰三角形底边的宽度(英寸)
- HHH:等腰三角形的高(英寸)
计算一系列内切圆的周长之和,这些圆从底边到顶部依次堆叠:
- 最低的内切圆与底边和两腰相切
- 下一个更高的内切圆与下方的内切圆和两腰相切
- 依此类推,直到最小圆的半径小于0.0000010.0000010.000001
输入格式
第一行是一个正整数nnn,表示测试用例的数量。每个测试用例一行,包含两个正实数BBB和HHH。
输出格式
对于每个测试用例,输出一个实数(121212位有效数字,其中666位小数),表示所有内切圆周长之和。
样例输入
1 0.263451 0.263451样例输出
0.827648题目分析
问题的本质
这是一个几何级数求和问题。在等腰三角形中,从底边开始依次向上堆叠内切圆,每个圆都与两腰相切,并与下方的圆相切。需要计算所有圆的周长之和。
几何关系
等腰三角形的底边BBB,高HHH,腰长L=(B/2)2+H2L = \sqrt{(B/2)^2 + H^2}L=(B/2)2+H2。
第一个圆(最低):
- 内切于等腰三角形,圆心在角平分线交点上
- 半径r1=B×HB+4H2+B2r_1 = \frac{B \times H}{B + \sqrt{4H^2 + B^2}}r1=B+4H2+B2B×H
后续圆:
- 每个新的圆都内切于上方剩余的小等腰三角形
- 新三角形与原三角形相似
- 半径递减比例恒定
半径递推关系
设第iii个圆的半径为rir_iri,其对应的等腰三角形高为HiH_iHi,底边为BiB_iBi。由相似性:
ri+1ri=Hi−2riHi+2ri \frac{r_{i+1}}{r_i} = \frac{H_i - 2r_i}{H_i + 2r_i}riri+1=Hi+2riHi−2ri
迭代终止条件
当r<0.000001r < 0.000001r<0.000001时停止。
参考代码
// Inscribed Circles and Isosceles Triangles// UVa ID: 375// Verdict: Accepted// Submission Date: 2016-07-03// UVa Run Time: 0.040s//// 版权所有(C)2016,邱秋。metaphysis # yeah dot net#include<bits/stdc++.h>usingnamespacestd;constdoublePI=2*acos(0.0);intmain(intargc,char*argv[]){ios::sync_with_stdio(false);doublen,B,H,sumOfR,r;cin>>n;cout<<fixed<<setprecision(6);for(inti=1;i<=n;i++){cin>>B>>H;// 测试用例间空行if(i>1)cout<<endl;sumOfR=0.0;// 第一个内切圆半径r=H*B/(B+sqrt(4*H*H+B*B));// 累加半径直到小于阈值while(r>=0.000001){sumOfR+=r;H-=2*r;// 剩余三角形高度r=r*H/(H+2*r);// 下一个圆的半径}// 输出周长之和,右对齐 13 位cout<<right<<setw(13)<<(2.0*PI*sumOfR)<<endl;}return0;}