ZOJ

来源:互联网 发布:雕刻机画图软件 编辑:程序博客网 时间:2024/06/06 03:03

点我看题

题意:给出三角形的内切圆和外接圆的半径,判断是否存在满足这样条件的三角形,如果存在的话,输出满足条件的任意一个三角形的三边的长度。

分析:如果单纯的用内切圆外接圆和三角形的关系公式的话,是得不到结果的。首先我们考虑,要怎么判断是否存在这样的一个三角形呢?三角形的极端情况就是等边三角形,对于一个等边三角形来说,他的内切圆半径最大,外接圆半径最小,且内切圆的半径为外接圆半径的1/2,这个时候如果外接圆半径r1>内切圆半径r2/2那么就不存在满足条件的三角形。当r1<=r2/2时,利用二分来求解。先把要求解的三角形抽象为等腰三角形,设底边长度为a,腰为c,通过不断二分底边长度(极端情况l=0,r=等边三角形的长),根据内切圆和外接圆求得腰的长度,然后不断逼近答案。

//纯高中数学+二分哇

//输出的小数点个数在8以上应该都可以,没有固定要求

参考代码:

#include<cstdio>#include<cmath>#include<cstring>#include<algorithm>#include<algorithm>using namespace std;#define eps 1e-8double r1,r2;//r1为内切圆半径,r2为外接圆半径int main(){    while( ~scanf("%lf%lf",&r1,&r2))    {        if( r1-r2/2 > eps)        {            puts("NO Solution!");            continue;        }        else        {            double l = 0;            double r = sqrt(3.0)*r2;            double mid,a1,h1,a2,h2;            while( r-l >= eps)            {                mid = (l+r)/2.0;                h1 = r2+sqrt(r2*r2-mid*mid/4.0);                a1 = sqrt(h1*h1+mid*mid/4.0);                h2 = sqrt(r1*r1+(a1-mid/2.0)*(a1-mid/2.0))+r1;                a2 = sqrt(h2*h2+mid*mid/4.0);                if( a2 - a1 < eps)                    r = mid;                else                    l = mid;            }            printf("%.10f %.10f %.10f\n",a1,a1,mid);        }    }    return 0;}