LightOj1137

题目链接:http://lightoj.com/volume_showproblem.php?problem=1137

题意:有一根绳子的长度为l,在有温度的情况下会变形为一个圆弧,长度为 l1 = (n*c+1)*l;求图中的h;并说明增加的长度不超过原长度的一半;

我们可以二分h,然后根据h求弧长,比较一下和l1的长度即可;

把弧长公式记错我也是醉了;

 

#include <stdio.h>
#include <algorithm>
#include <cstring>
#include <cmath>
using namespace std;
const int N = 2010;
const double eps = 1e-6;
const double PI = acos(-1);

int main()
{
    int T, t = 1;
    double n, c, l;
    scanf("%d", &T);
    while(T--)
    {
        scanf("%lf %lf %lf", &l, &n, &c);
        double l1 = (n*c+1)*l;
        double left = 0, right = l/2, ans = 0;
        while(right-left > eps)
        {
            double mid = (right + left)/2;/// h;
            double r = (l*l/4+mid*mid)/(2*mid);///半径r;
            double a = 2*acos((r-mid)/r);///圆心角a,弧长公式a*r;
            if(fabs(r*a-l1)<eps)
            {
                ans = mid;
                ///break;不能加这句...;
            }
            if(r*a < l1)
                left = mid;
            else
                right = mid;
        }
        printf("Case %d: %.6f
", t++, ans);
    }
    return 0;
}
View Code

 

原文地址:https://www.cnblogs.com/zhengguiping--9876/p/5915832.html