Ball Dropping

题目链接:nowcoder 223572

找主站看:https://blog.csdn.net/weixin_43346722/article/details/118903362

题目大意

给你一个中间空的等腰梯形。
然后有一个圆,问你是否能从中间穿过梯形。

思路

在这里插入图片描述
看看题目给的图,很明显,数学题。

首先分析要看能不能通过,用脚想一想可以知道如果圆直径大于 就掉不下去。
然后我们考虑掉不下去怎么求距离。

看到梯形我们考虑用相似三角。

在这里插入图片描述
首先两个相似求出

然后由于它是等腰,我们可以继续求。

在这里插入图片描述

(注意这个球掉到上面的地方与墙面碰到的两个点组成的直线不是直径)
(我当时就搞错了,搞了半天才发现,两个墙壁是它的切线)

用勾股可以得到
然后根据相似,可以得到


然后就好了!

代码

#include<cmath>
#include<cstdio>
#include<algorithm>

using namespace std;

long double r, a, b, h;

int main() {
    scanf("%Lf %Lf %Lf %Lf", &r, &a, &b, &h);
    if (a < b) swap(a, b);

    if ((r * 2.0) <= b) printf("Drop");
        else {
            printf("Stuck\n");
            long double beta = b * h / (a - b);
            long double side = sqrt((a / 2) * (a / 2) + (beta + h) * (beta + h));
            printf("%Lf", side * r / (a / 2) - beta);
        }

    return 0;
}