当刀痕长度从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; }