题目:这里
题意:光滑的水平直线上有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\n",sqrt(v[k]*v[k]+2*ti*c)); 28 } 29 } 30 return 0; 31 }