速度+加速度+积分
题意:
有n个小球,最开始给出小球的初始位置和初速度和方向,每一个小球的加速度满足C=a∗v,C为常数a为加速度v为速度,现在问在t秒的时候,第k小的速度是多少。
思路:
最开始千万别被吓到,小球的速度因为满足动量守恒,所以即使相撞也只是两个求交换了一下速度,不影响球的实际运动。所以第k 小的速度直接就是最开始的第k小。
再求出t秒时候的速度时,可以根据题上的加速度情况积分:C/v=v/dt,可以推出Cdt=vdv,进而fvvovdt=ft0Cdt,从而v2−v20=2Ct
直接带入即可。
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
using namespace std;
const int maxn = 1e5+10;
int n,q;
int v[maxn],C;
double cal(int time,int k)
{
int tmp = C*time+v[k]*v[k];
double ans = sqrt((double)tmp);
return sqrt(2.0*C*time+1.0*v[k]*v[k]);
}
int main()
{
// freopen("in.txt","r",stdin);
int t;
scanf("%d",&t);
while(t--) {
scanf("%d%d",&n,&C);
for(int i = 1;i <= n; i++) {
int vi,xi,di;
scanf("%d%d%d",&vi,&xi,&di);
v[i] = vi;
}
sort(v+1,v+1+n);
scanf("%d",&q);
while(q--) {
int time,k;
scanf("%d%d",&time,&k);
printf("%.3f\n",cal(time,k));
}
}
return 0;
}