题目链接:https://atcoder.jp/contests/abc144/tasks/abc144_d
题意:
有一个长方体的杯子,底面为边长为acm的正方形,高度为bcm。
现在向杯中倒入xcm3立方的水。问最大倾斜多少角度,杯中的水不会漏出来。
题解:
看到了网上的部分题解,写的都很麻烦。所以决定写一个自己的题解。
以下是我的个人分析(建议自己画个图,在根据我的题解去理解):
脑子里先想想一下下,倾斜到刚好不会洒出来的样子有两种:
(1)直角三角形,杯子底部是可见的。
(2)直角梯形,杯子底部不可见。
区分这两种的界限是导入的水的体积刚好是a*(a* b)/2;即刚好水面与杯脚齐平。
计算角度(假设向右倾斜):
(1)三角形
由于万有引力,倾斜后水面是水平的。
所以倾斜的角度就等于90o C-三角形的右上角。(利用的是三角形角度相等·初中知识)
记三角形右上角为r。整体的体积=(底边长 * b)/ 2* a;
那么tanr=(x/a/b/(1/2))/b;
用c++的反三角就可以计算出角度。
(2)梯形
同理,整体体积=((a *上边)+(a * (b-下底边))/2)*a;
tanr=a/(b-下底边);
两种利用体积相等都可以计算出未知变量。
AC代码(关键代码就两行):
#include <bits/stdc++.h>
//#pragma GCC optimize(2)
using namespace std;
#define LL long long
const double PI=atan(1.)*4.;
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
double a,b,x,ans;
cin>>a>>b>>x;
double s=x/a;
if(s*2.0<=a*b){//三角形
double aa=s*2.0/b;
ans=90.0-atan(aa/b)*180.0/PI;
}
else{//梯形
double x=(s*2.0-a*b)/a;
ans=90.0-atan(a/(b-x))*180.0/PI;
}
cout<<fixed<<setprecision(10)<<ans<<"\n";
return 0;
}
欢迎评论!