问题描述
张三参加了不朽物理奥林匹克运动会。比赛的第0个问题如下。
有两个球分别重一公斤和二公斤。在这个问题中,它们可以被看作是粒子,因为它们足够小。在一开始(即t=0),两个球之间的距离为d km,并且两个球都不移动。
假设在这个系统中只有引力起作用(不考虑其他物体或其他力)。两个球从t=0开始移动。你的任务是当t=t0(s)时计算它们之间的距离。
帮张三解决问题!
以下信息可能有助于解决问题。
-万有引力公式:F=G⋅m1⋅m2/r2
-重力常数:G=6.67430×10−11m3/(kg⋅s2)
输入
输入的第一行给出测试用例数T(1≤T≤100)。T测试用例如下。
对于每个测试用例,唯一的一行包含四个整数a,b,d,t0(1≤a,b,d,t0≤100),表示两个球的质量,它们之间的初始距离,以及球移动的时间。
保证两个球在(t0+1)秒内不会相撞。
输出
对于每个测试用例,用实数x打印一条线,表示距离是x km。
你的答案的绝对或相对误差应不超过10-6。
思路
刚看到题觉得物理题公式推一下就好了。最后推出一个一元三次方程,在我还在思考怎么解时,队友说过了。t0<=100,位移小,加速度变化忽略,当匀加速就行了。直接r=d-a1t0 ^ 2/2-a2t0 ^2/2.稍稍怀疑了下人生,阿巴阿巴。
代码:
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int N=55;
const int
inf=0x3f3f3f3f;
const int
mod=1e9+7;
const double
G=6.6743;
inline int
rd(){
register int s=0,w=1;
register char ch=getchar();
while(ch<'0'||ch>'9')
{
if(ch=='-') w=-1;
ch=getchar();
}
while(ch>='0'&&ch<='9')
{
s=s*10+ch-'0';
ch=getchar();
}
return s*w;
}
int main() {
int t;
t=rd();
while(t--)
{
double a,b,d,t;
a=rd(),b=rd(),d=rd(),t=rd();
double x=d*1000;
x=x*x;
double s=(G*0.5*t*t*(a+b)/x)/100000000000;
//printf("%.20f\n",s);
//d=d-s;
printf("%.20f\n",d-s);
}
return 0;
}