题意:
n个质量完全相同的球放在一条直线上,每个球都有一个位置和初速度以及运动方向,球坐变加速运动,其加速度和速度的乘积为定值C,从某一时刻开始计算,有q个询问,每个询问需要求出在第t秒钟,n个球中第k小的速度是多少。
思路:
看到题,因为n个球质量相同,所以碰撞时交换速度,等价于忽略了碰撞,所以对这道题来说,球的初始位置和方向是多余条件。
对于加速度a和速度v的乘积为定值c,我们可以列出一个微分方程:
a = dv / dt = c / v
移项为 :
vdv = cdt
对于两边定积分,就可以得到 :
v*v - v0*v0 = ct * 2
由方程可以得出,初速度的大小就能决定之后速度的大小,所以可以先排序。
代码:
#include <bits/stdc++.h>
using namespace std;
const int MAXN = 1e5 + 10;
int a[MAXN];
int main() {
//freopen("in", "r", stdin);
int T;
scanf("%d", &T);
while (T--) {
int n, c, m;
scanf("%d%d", &n, &c);
for (int i = 1; i <= n; i++) {
int x, y;
scanf("%d%d%d", &a[i], &x, &y);
}
sort (a + 1, a + 1 + n);
scanf("%d", &m);
while (m--) {
int t, k;
scanf("%d%d", &t, &k);
double ans = sqrt(1.0 * a[k] * a[k] + 2.0 * c * t);
printf("%.3f\n", ans);
}
}
return 0;
}