HDU 5826-physics
题目原址
[http://acm.hdu.edu.cn/showproblem.php?pid=5826]
题意
模拟多个相同小球一维运动碰撞的物理情景,这些小球都满足 v ⋅ a = C ( C 是 常 数 ) ( v 与 a 方 向 相 同 ) v\cdot{a}=C(C是常数)(v与a方向相同) v⋅a=C(C是常数)(v与a方向相同) ,碰撞为完全弹性碰撞,给出每个小球的初始位置 x i x_{i} xi,速度 v i v_{i} vi,方向 d i ( − 1 或 1 ) d_{i}(-1或1) di(−1或1),询问 t t t 秒后第 k k k 小的速度(不是第 k k k 个小球)。
题解
- 方程 v ⋅ a = C v\cdot{a}=C v⋅a=C 说明小球速度逐渐增大,加速度逐渐减小。而且假若小球之间无碰撞,他们每一时刻的速度大小顺序与初始时刻的速度大小顺序相同。
- 完全弹性碰撞说明小球之间的碰撞只是交换速度而不改变速度大小,所以即便小球之间存在碰撞,他们的速度大小顺序也不会因碰撞而改变
- 根据数学微积分:
a = d v d t = C v a=\frac{dv}{dt}=\frac{C}{v} a=dtdv=vC v ⋅ d v = C ⋅ d t v\cdot{dv}=C\cdot{dt} v⋅dv=C⋅dt v 2 2 ∣ v 0 v = C t ∣ 0 t \left.\frac{v^{2}}{2}\right|_{v_{0}}^{v}=\left.Ct\right|_{0}^{t} 2v2∣∣∣∣v0v=Ct∣0t v = 2 C t + v 0 2 v=\sqrt{2Ct+v_{0}^{2}} v=2Ct+v02上式则是 t t t 秒时速度 v v v 的表达式。
实现
#include <stdio.h>
#include <algorithm>
#include <math.h>
const int maxn = (int)1e5+5;
int v[maxn];
int i,j,k;
int main(){
int T;
scanf("%d",&T);
int n,c;
int m,t,k;
while(T--){
scanf("%d %d",&n,&c);
for(i=0;i<=n;i++)
scanf("%d %d %d",&v[i],&j,&k);
std::sort(v,v+n);
scanf("%d",&m);
for(i=1;i<=m;i++){
scanf("%d %d",&t,&k);
printf("%.3lf\n",sqrt(2.0*c*t+1.0*v[k-1]*v[k-1]));
}
}
return 0;
}