题意
数轴上给出一些点的初始速度
vi
,初始位置
Xi
,初始方向
Di
,质量相同的质点。
在每个时刻
vi⋅ai=C
,其中
vi
为速度,
ai
为加速度,
C
为给定的常数。
每次询问第
题解
由于碰撞为完全弹性碰撞,相撞的两球交换方向和速度,可以看做互相穿过,那么这道题给出的
略微思考可以相处在所有的时刻,质点的速度的大小关系是不会改变的(其中将碰撞视为互相穿过),可以较为直观地脑补一下,画出满足 v⋅a=C 的 v−t 图像,这个图像是单增的,不同的 vi 在图中对应着不同的点,过去相同时刻后速度大小关系还是不变。
于是我们将初始速度从小到大排序,询问的
t
,
我们用的不定积分
a=cv
dv=a⋅dt=cv⋅dt
v⋅dv=c⋅dt
左右同时积分可得
12v2t=c⋅t+C
其中C为不定积分中的常量,结合题目可得 C=12v20
即12v2t=c⋅t+12v20
v2t=2ct+v20
vt=2ct+v20−−−−−−−√
同学用的动能定理的方法
av=c
对每个时刻功率 P
P=F⋅v=mav=mc
P 为固定值,由动能定理得
Pt=12mv2t−12mv20=mct
整理得
vt=2ct+v20−−−−−−−√
代码
#include <bits/stdc++.h>
using namespace std;
typedef double DB;
int n, c;
const int maxn = 1e5 + 100;
int a[maxn];
int main() {
int T;
scanf("%d", &T);
while (T--) {
scanf("%d %d", &n, &c);
for (int i = 1; i <= n; ++i)
scanf("%d %*d%*d", &a[i]);
sort(a + 1, a + n + 1);
int q;
scanf("%d", &q);
while (q--) {
int t, k;
scanf("%d %d", &t, &k);
int x = a[k];
printf("%.3lf\n", sqrt(2.0 * c * t + 1.0 * x * x));
}
}
return 0;
}