题目链接
题意:
给你n个小球,这些小球有起始的位置和方向,然后还有一个常数C,小球的瞬时速度和加速度满足av=C,然后有q次查询,问你在t秒后速度第k小的小球的速度。小球碰撞的时候是完全弹性碰撞
思路:
首先套普及一下完全弹性碰撞:
完全弹性碰撞的意思就是两个小球相撞后没有损失二者交换速度.
如果两个小球相向而行,那么两个小球互相交换速度,且保持原来另一个小球的方向运动.
如果一个运动的小球撞静止的小球,那么静止的小球以它的速度运动,另一个求静止.
同样的如果两个球同样的方向运动,但是后面的速度大,赶上的前面的小球,那么二者交换速度,前面小球的速度就比后面小球的速度快了.
这个题目会联想到POJ那个蚂蚁的题目,也就是对这个题目来说不需要去管小球碰撞,所有的速度是不变的(前提是a*v = c),相对大小也是不变的.
也就是说原本是第几小还是第几小.根据这个性质我们可以排个序然后求t秒后速度.
a = dv/dt 又根据v*a = c 得出
v*dv = c*dt .两边同时积分得 v’ =
(√v0∗v0+2∗c∗t)
#include<bits/stdc++.h>
using namespace std;
const int maxn= 1e5+5;
typedef long long ll;
ll v[maxn],c;
int n;
int main()
{
int _;
cin>>_;
while(_--)
{
scanf("%d %lld",&n,&c);
for(int i = 1;i <= n;++i)
{
int x,d;
scanf("%lld %d %d",&v[i],&x,&d);
}
sort(v+1,v+1+n);
int q;
scanf("%d",&q);
while(q--)
{
ll k , t;
scanf("%lld %lld",&t,&k);
ll a = v[k]*v[k]+2*c*t;
double ans = sqrt(a*1.0);
printf("%.3f\n",ans);
}
}
return 0;
}