切蛋糕
有如下图半径为R的圆形蛋糕,被切一刀后(图中红色直线),分成两个部分(黄色和绿色),已知其比例为r,求刀痕长度(图中红色直线)
-
- 输入
- 输入包括多组测试数据,包括一个整数R(1<=R<=1000),和一个浮点数r(0<r<1),精确到第四位小数。 输出
- 对于每组测试用例,输出一个浮点数,代表刀痕的长度,保留二位小数。 样例输入
-
1000 0.5000 500 0.6183
样例输出 -
1928.53 982.49
这个题目中犯的错误主要是:1.精度问题 2.类型转换问题。
/************* Author:jiabeimuwei Times:0ms; Sources: 九度OJ 1551 切蛋糕 && NYOJ 869 *************/ #include<cstdio> #include<cstring> #include<cstdlib> #include<iostream> #include<algorithm> #include<cmath> #include<ctime> #include<queue> #include<stack> using namespace std; //#include<windows.h> //#include<conio.h> #define max(a,b) a>b?a:b #define min(a,b) a>b?b:a #define mem(a,b) memset(a,b,sizeof(a)) #define malloc(sb) (sb *)malloc(sizeof(sb)) #define EPS 1e-8 #define DINF 1e15 #define MAXN 100050 #define MOD 1000000007 const double pi=acos(-1); double r,yy,sanx,sb,s,q1,q2; double low,high,m,R; int main() { while(scanf("%lf %lf",&R,&r)!=EOF) { s= pi*R*R; low = 0.0000001,high = 2*R; while(low<=high) { m= (low+high)/2; yy = asin(m/2/R); sanx= R*R*yy; sb = R*R/2.0*sin(2*yy); q1 =sanx-sb; q2=s-q1; if(q1>=q2*r) { high = m-0.00001; } else { low = m+0.00001; } } printf("%0.2f\n",m); } return 0; }