这题的意思是给你一根绳子,可收缩,告诉你跳下时候的高度,看会不会安全到地上,或是被吊在空中,或是被摔死。
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
using namespace std;
int main()
{
float k, l, s, m;
while(scanf("%f%f%f%f", &k, &l, &s, &m) != EOF && k+l+s+m)
{
//如果绳子的长度大于桥的高度,肯定不会被吊在空中,只会安全着陆,或是被摔死。
if(l >= s)
{
if(sqrt(2 * 9.81 * s) > 10) //根据动能定理,求出到达地面时候的速度v = sqrt(2gh),速度大于10,被摔死
{
puts("Killed by the impact.");
continue;
}
else //没被摔死
{
puts("James Bond survives.");
continue;
}
}
else //绳子长度小于桥的高度,各种情况都会发生
{
float v = sqrt(2 * 9.81 * l); //绳子完全展开但是还没有伸长量的时候的速度v
float mgl = m * 9.81 * l;
double a = k, b = -2 * m * 9.81, c = -2 * mgl;
double x = (-b + sqrt(b * b - 4 * a * c)) / (2 * a);
if(l + x < s) //当人的合外力做功全部转化成绳子的弹性势能时,也就是绳子已经不能再被拉长了
{//这个时候人还没有到达地面的话,就要被一直吊在空中了。。。
puts("Stuck in the air.");
continue;
}
//人如果到达地面了,就要判断到达地面时候的速度是否大于10.
//此时绳子伸长量s-l,弹性势能为0.5k(s-l)^2,
//设到达地面的速度为v0, 根据动能定理,有合外力做功等于动能增量,所以
//0.5mv0^2 - 0.5mv^2 = mg(s-l) - 0.5k(s-l)^2
float temp = m * 9.81 * (s - l) - 0.5 * k * (s - l) * (s - l) + 0.5 * m * v * v;
float v0 = sqrt(2 * temp / m);
if(v0 > 10) //还是被摔死了
{
puts("Killed by the impact.");
continue;
}
else//捡回一条命
{
puts("James Bond survives.");
continue;
}
}
}
return 0;
}