题目链接:
http://acm.hdu.edu.cn/showproblem.php?pid=5826
题意:
给定$n$个小球移动方向,速度与加速度的关系,小球之间的碰撞为弹性碰撞,问给定时间后速度第$k$大的小球的速度。
分析:
首先无能量损失的碰撞,碰撞不会改变速度大小。最后速度大小也和方向无关。
由$P=Fv, Pt = \frac{1}{2}mv^2- \frac{1}{2}mv_0^2$,
得$2a_0v_0t=v^2-v_0^2$,即$v= \sqrt{2a_0v_0t+v_0^2}$
只要找到初始第$k$大的速度,最后结束时也是第$k$大,再套下公式即可。
代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35
| #include<iostream> #include<cstdio> #include<cstring> #include<queue> #include<vector> #include<set> #include<map> #include<cmath> #include<stack> #include<algorithm> using namespace std; typedef pair<int, int>p; const int maxn = 1e5 + 5; int v[maxn]; int main (void) { int T;scanf("%d", &T); while(T--){ int n, c;scanf("%d%d",&n, &c); int x, d; for(int i = 0; i < n; i++){ scanf("%d%d%d", &v[i], &x, &d); } sort(v, v + n); int q;scanf("%d", &q); int t, k; for(int i = 0; i < q; i++){ scanf("%d%d", &t, &k);k--; double vv = sqrt(2.0 * c * t + 1.0 * v[k] * v[k]); printf("%.3f\n", vv); } } return 0; }
|