题意:有一个长方体的水杯,底面为一个边长为 aa cm 的正方形,高 bb cm,现在往里加入 xx cm3^3 的水,然后让水杯倾斜(只有底面一条边着地),求能够倾斜的最大角度。

一道很有趣的思考题,要分两种情况讨论。

对于第一种情况成立的条件是 2xa2b2x\leq a ^2 b,而第二种情况成立的情况为 2x>a2b2x>a ^2 b。(即如果两倍的水能否装满杯子为界限)。

对于第一种情况,我们可以把水在底面的长度算出来,为:

l=2xab l=\frac{2x}{ab}

然后就可以得到弧度为:

θ=arctan(bp) \theta=\arctan(\frac{b}{p})

对于第二种情况,我们把水在另一边的高的长度算出来,为:

l=2xa2b l=\frac{2x}{a ^2}-b

同样得到弧度为:

θ=arctan(bpa) \theta=\arctan(\frac{b-p}{a})

最后对于每一个判断条件,把弧度换成角度,换算公式如下:

α=180°θπ \alpha=\frac{180^{°}\theta}{\pi}

在计算机中,我们可以通过如下条件来得到 π\pi

π=4arctan(1) \pi=4\arctan(1)

代码:

#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cmath>
#include<algorithm>
using namespace std;
double a,b,x;
double p1,ans1,p2,ans2,ans;
int main()
{
	scanf("%lf%lf%lf",&a,&b,&x);
	p1=x*2.0/a/a-b;
	p2=x*2.0/a/b;
	ans1=atan((b-p1)/a)*180.0/atan(1.0)/4.0;
	ans2=atan(b/p2)*180.0/atan(1.0)/4.0;
	if(2.0*x>=a*a*b)
		ans=ans1;
	else
		ans=ans2;
	printf("%lf",ans);
	return 0;
}