九度oj 1551 二分 + 精度

当刀痕长度从0--2*R 区间时, 比例是递增函数, 故满足二分法的条件。即  r(h)  =r0 , 求h

题目来源:

http://ac.jobdu.com/problem.php?pid=1551

题目1551:切蛋糕

时间限制:1 秒

内存限制:128 兆

特殊判题:

提交:257

解决:84

题目描述:

有如下图半价为R的圆形蛋糕,被切一刀后(图中红色直线),分成两个部分(黄色和绿色),已知其比例为r,求刀痕长度(图中红色直线)。

输入:

输入包括多组测试数据,包括一个整数R(1<=R<=1000),和一个浮点数r(0<r<1),精确到第四位小数。

输出:

对于每组测试用例,输出一个浮点数,代表刀痕的长度,保留二位小数。

样例输入:
1000 0.5000
500 0.6183
样例输出:
1928.53
982.49

代码如下:
#include<iostream>
#include<stdlib.h>
#include<stdio.h>
#include<math.h>
#include<string.h>
#include<string>
#include<queue>
#include<algorithm>
#define PI acos(-1.0)
#define eps 1e-8
using namespace std;
double R;
double area(double h)
{
    double arc=asin(h*0.5/R);
    return R*R*arc- 0.5 *h*sqrt(R*R - 0.25*h*h);
}
double are(){return R*R*PI;}

double judge(double h)
{
    return area(h)/(are()-area(h));
}
double bin_search(double r)
{
    double left ,right, mid;
    left=0,right=2*R;
    double S=are();
    while(right-left>eps)
    {
        mid=(left+right)*0.5;
        if(judge(mid) >r )
            right=mid;
        else left = mid;
    }
    return (left+right)*0.5;

}
int main()
{
    double r;
    while(cin>>R>>r)
    {
        printf("%.2f
",bin_search(r));
    }
    return 0;
}




 
原文地址:https://www.cnblogs.com/zn505119020/p/3592093.html