当刀痕长度从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-9 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)/2; if(judge(mid) - r> eps ) right=mid-eps; else left = mid+eps; } return (left+right)/2.0; } int main() { double r; while(cin>>R>>r) { printf("%.2f\n",bin_search(r)); } return 0; }
九度oj 1551 二分 + 精度,布布扣,bubuko.com
原文:http://www.cnblogs.com/zn505119020/p/3592093.html