hdu 5826 (物理) physics

题目:这里

题意:光滑的水平直线上有n个质量相等的小球,已知每个小球的初始位置,初始速度和方向,每个小球的每个时刻的加速度a都满足a*v=c,v是该时刻的速度,c是已知的

常数,小球之间的碰撞是完全碰撞(不明白就百度),然后q个询问,每次询问第t秒时速度第k小的小球速度是多少?


完全碰撞即碰撞后速度交换,速度还是那两个速度,只是不是原来那个球了而已,但这并不时需要考虑的,因为只需要关心速度,所以初始方向以及初始位置什么的都不需要在意,

因为加速度a=c/v,加速度每时每刻都在变,速度每时每刻也在变,而且不是均匀的变化,所以因为加速度a=dv/dt=c/v==>dt/dv=v/c==>t=v^2/(2*c)-v0(初始速度)^2/(2*c)

v=sqrt(v0*v0+2*t*c),由这个式子可以知道初始速度的大小顺序在t秒后速度的大小顺序依旧不变,现在是第几大的t秒后依旧是第几大的。

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<iostream>
 4 #include<algorithm>
 5 #include<cmath>
 6 using namespace std;
 7 
 8 const int M = 1e5 + 10;
 9 double v[M];
10 
11 int main()
12 {
13     int t,n;double c;
14     scanf("%d",&t);
15     while (t--){
16         scanf("%d%lf",&n,&c);
17         for (int i=1 ; i<=n ; i++){
18             int x,y;
19             scanf("%lf%d%d",&v[i],&x,&y);
20         }
21         sort(v+1,v+n+1);
22         int q;
23         scanf("%d",&q);
24         while (q--){
25             int k;double ti;
26             scanf("%lf%d",&ti,&k);
27             printf("%.3lf
",sqrt(v[k]*v[k]+2*ti*c));
28         }
29     }
30     return 0;
31 }
原文地址:https://www.cnblogs.com/JJCHEHEDA/p/5762547.html