题意不多说了,写的时候脑残了,没看懂题目,以为求最大的面积,。。。。。。。结果求刚好倒出水的临界面积
思路:
参考一下这个博客推导很清晰:http://blog.csdn.net/danliwoo/article/details/53002695
求出刚好倒出的角度,用二分倾斜角度的方法求出答案
要记得椭圆投影成圆的面积的公式 S圆=S椭圆cosX
还有过不去的时候把精度1E-8改成1E-10 [黑脸][黑脸][黑脸]
#include<bits/stdc++.h> using namespace std; const double pi=acos(-1.0); const double epx=1e-10; double f(double x) { double y=acos(2*tan(x)-1); double a1,a2; a1=pi*cos(y)-y*cos(y)+sin(y)-(1.0/3.0)*sin(y)*sin(y)*sin(y); y=pi; a2=pi*cos(y)-y*cos(y)+sin(y)-(1.0/3.0)*sin(y)*sin(y)*sin(y); return (1.0/tan(x))*(a1-a2); } double fen(double L) { double l=0.0,r=pi/4.0; double mid; while(r-l>=epx) { mid=(l+r)/2.0; if(f(mid)>L) r=mid; else l=mid; } return mid; } int main() { double a,b,c,x,y; int t; scanf("%d",&t); while(t--) { scanf("%lf",&a); if(a==0) printf("%.5f\n",0.0); else if(a>=1.0) { b=2.0-a; b=sqrt(1+b*b); printf("%.5f\n",b*pi); } else { x=fen(a*pi); y=acos(2*tan(x)-1); y=pi-y+cos(y)*sin(y); printf("%.5f\n",y/sin(x)); } } return 0; }