记录编号 26019 评测结果 AAAAAAAAAA
题目名称 饥饿的母牛 最终得分 100
用户昵称 GravatarPurpleShadow 是否通过 通过
代码语言 C++ 运行时间 0.015 s
提交时间 2011-07-22 16:14:20 内存使用 0.26 MiB
显示代码纯文本
    #include <cstdio>  
    #include <cmath>  
    const double eps=1e-12,pi=3.1415926535897;  
    double l,d,s,x,a,r,m,t;  
    double height(double x)  
    {return sqrt(r*r-(x+t)*(x+t));}  
	double simpson(double l,double r)
	{
		double mid=(l+r)/2;
		return (height(l)+height(r)+4*height(mid))/6*(r-l);
	}
	double rsimpson(double l,double r)
	{
		double mid=(l+r)/2;
		if (fabs(simpson(l,r)-simpson(l,mid)-simpson(mid,r))/15<eps) return simpson(l,r);
		return rsimpson(l,mid)+rsimpson(mid,r);
	}
    double slove()  
    {  
        if (s<=d) return s*s*pi;  
        if (s<=x)
		{
			m=sqrt(s*s-d*d);
			a=2*asin(m/s);
			return s*s*(2*pi-a)/2+m*d;  
		}
		a=2*asin(l/(2*x));  
        double ans=s*s*(2*pi-a)/2+(s-x)*(s-x)*(pi+a)/2+l*d/2;  
        if (s<=(x+l/2)) return ans;  
        r=(s-x);m=r-l/2;t=l/2;  
		double tmp=rsimpson(0,m);
        tmp*=2;  
        return ans-tmp;  
    }     
    int main()  
    {  
    freopen("hungry.in","r",stdin);  
    freopen("hungry.out","w",stdout);  
        int t;  
        scanf("%d",&t);  
        while (t--)  
        {  
            scanf("%lf%lf%lf",&l,&d,&s);  
            x=sqrt((l/2)*(l/2)+d*d);  
            printf("%.2lf\n",slove());  
        }  
        return 0;  
    }