zoj 3806 Incircle and Circumcircle(二分)

2015-07-20 17:47:16 · 作者: · 浏览: 4

题目链接:zoj 3806 Incircle and Circumcircle

题目大意:给定三角形的内接圆半径和外切圆半径,求三角形的三边长。

解题思路:以等腰三角形去构造,确定外切圆半径的时候,内切圆半径的范围为0?3 ̄ ̄√R,二分判断即可。

#include 
   
     #include 
    
      #include 
     
       #include 
      
        using namespace std; double f (double a, double R) { double t = sqrt(R * R - a * a / 4) + R; return sqrt(t * t + a * a / 4); } double judge (double a, double b, double R) { return a * b * b / (2 * R * (a + b + b)); } double bsearch (double l, double R, double v) { double r = sqrt(3.0) * R; for (int i = 0; i < 1000; i++) { double mid = (l + r) / 2; double x = f(mid, R); if (judge(mid, x, R) > v) r = mid; else l = mid; } return (l + r) / 2; } int main () { int r, R; while (scanf("%d%d", &r, &R) == 2) { if (r * 2 > R) printf("NO Solution!\n"); else { double a = bsearch(0, R, r); double b = f(a, R); printf("%.10lf %.10lf %.10lf\n", a, b, b); } } return 0; }