zoukankan      html  css  js  c++  java
  • ZOJ 3806 Incircle and Circumcircle(几何+二分)

    博客原文地址:http://blog.csdn.net/xuechelingxiao/article/details/38820755

    Incircle and Circumcircle

    题目大意:给你一个三角形的内切圆半径跟外接圆半径,求解出符合条件的三角形,输出三角形的三条边的长度,如果没有符合条件的三角形,输出“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 */
    ZOJ 3806
  • 相关阅读:
    Sum of a Function(区间筛)
    (01背包)输出方案数
    删边求概率
    完全背包输出方案数(dp)
    二分
    Just Arrange the Icons(模拟)
    Balls of Buma(回文串)
    dp思想
    刷题-力扣-190. 颠倒二进制位
    刷题-力扣-173. 二叉搜索树迭代器
  • 原文地址:https://www.cnblogs.com/Silence-AC/p/3935014.html
Copyright © 2011-2022 走看看