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; }