博客原文地址:http://blog.csdn.net/xuechelingxiao/article/details/38820755
题目大意:给你一个三角形的内切圆半径跟外接圆半径,求解出符合条件的三角形,输出三角形的三条边的长度,如果没有符合条件的三角形,输出“NO Solution!”。
解题思路:这个题是SP,既是因为情况不唯一,而且还有精度的误差。
首先能够想到的就是NO Solution!的情况,即当内切圆半径等于1/2外接圆半径时,此时内切圆最大,而三角形为等边三角形,如图。
其次要解决的就是怎么构造三角形的问题,因为解不唯一,所以只要列举出一种解就OK,于是就很容易的想到构造等腰三角形,在最大与最小之间二分等腰三角形的底边长度,解三角形得到答案,如图。
如果还是不明白就看一下代码:
1 #define sqr(x) (x)*(x) 2 3 int main() 4 { 5 double r, R; 6 while(~scanf("%lf%lf", &r, &R)){ 7 if(R < 2*r){ 8 printf("NO Solution! "); 9 continue; 10 } 11 double left = 0, right = sqrt(3.0)*R; 12 while(right-left > eps){ 13 double mid = (left+right)/2.0; 14 double t = sqrt(sqr(sqrt(sqr(R)-sqr(mid/2.0))+R)+sqr(mid/2.0)); 15 //printf("%lf ", t); 16 if(sqr(sqrt(sqr(r)+sqr(t-mid/2.0))+r) + sqr(mid/2.0) - sqr(t) < eps){ 17 right = mid; 18 } 19 else { 20 left = mid; 21 } 22 } 23 24 double p = sqrt(sqr(sqrt(sqr(R)-sqr(left/2.0))+R)+sqr(left/2.0)); 25 printf("%.16lf %.16lf %.16lf ", p, p, left); 26 } 27 28 29 return 0; 30 } 31 32 /*Sample test*/ 33 /* 34 35 */