Atcoder Beginner Contest 144 D - Water Bottle(计算几何)

题目链接: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;
}

欢迎评论!

猜你喜欢

转载自blog.csdn.net/wjl_zyl_1314/article/details/102797721