题意不多说了,写的时候脑残了,没看懂题目,以为求最大的面积,。。。。。。。结果求刚好倒出水的临界面积
思路:
参考一下这个博客推导很清晰: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;
}