题目链接
题意
一个人逃跑要从天桥上跳下去。他有一根绳子。已知绳子长度,劲度系数,天桥高度,人的重量,重力加速度,问你这个人跳下去会是什么情况。
如果不能着地则输出”Stuck in the air.”
如果他着地时的速度大于10m/s,他死了输出”Killed by the impact.”
否则他获救了输出”James Bond survives.”
题解
通过重力势能和弹性势能之间的关系判断
第一种情况:l >= s 绳长大于桥高
说明一定会着地,且只有重力做功.只需要判断着地的v即可
v = sqrt(2*g*s)
第二种情况:l < s:绳长小于桥高
说明绳子的弹力做了功,需要考虑弹性势能
重力势能f1 = w*g*s;
弹性势能f2 = 1/2*k*(s-l)*(s-l);
如果 f1 < f2 :则不能着地,悬在空中
否则 判断着地时v是否大于10m/s [ v = sqrt((f1-f2)*2/m) ]
代码
/**
一个人逃跑要从天桥上跳下去。他有一根绳子。已知绳子长度,劲度系数,天桥高度,人的重量,重力加速度,
问你这个人跳下去会是什么情况。
*/
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
const double g = 9.81;
int main()
{
double k,l,s,w;
while(~scanf("%lf%lf%lf%lf",&k,&l,&s,&w),k+l+s+w)
{
if(l>=s) ///如果绳长大于桥的高度
{
double v = sqrt(2*g*s);
if(v > 10) cout<<"Killed by the impact."<<endl;
else cout<<"James Bond survives."<<endl;
}
else {
double f1 = w*g*s,f2=0.5*k*(s-l)*(s-l);
if(f1 < f2) cout<<"Stuck in the air."<<endl;
else {
double v = sqrt((f1-f2)*2/w);
if(v > 10) cout<<"Killed by the impact."<<endl;
else cout<<"James Bond survives."<<endl;
}
}
}
return 0;
}