题意:
给出n个小球的初始速度v0和方向,小球在横轴上运动,碰到其他球发生弹性碰撞,小球的加速的满足 a = C/v , (C为常数),问t秒后,速度第k大的小球的速度。
思路:
首先就是小球碰撞后会交互速度,并朝着相反方向回去, 也就相当于两个小球穿过对方过去了。。 像蚂蚁爬竿的那题
问题就转化成: 球 t 秒后 每个小球的速度,第k小的是多少, a= C/v = dv/dt , v*dv = c*dt , (v从 v0 积分到 v ),(t从0 积分到t)两边同时积分的 v *v - v0*v0 = 2*c*t;
等差数列,, 从式子可以看出,初始速度大的到后来的时间它还是大的,所以先按初始速度排下序列, 第k个小球t秒后的速度就是 t秒后 第k小的速度。
#include<bits/stdc++.h>
using namespace std;
const int maxn = 100005;
struct node
{
double v0,x,d,ans;
} a[maxn];
bool cmp(node x1 ,node x2)
{
return x1.v0<x2.v0;
}
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
int n;
double c;
scanf("%d%lf",&n,&c);
for(int i = 1; i<=n; i++)
{
scanf("%lf%lf%lf",&a[i].v0,&a[i].x,&a[i].d);
}
sort(a+1,a+1+n,cmp);
int q ;
double t ;
int k;
scanf("%d",&q);
for(int i = 1; i<=q; i++)
{
scanf("%lf%d",&t,&k);
printf("%.3lf\n",sqrt( a[k].v0*a[k].v0+(t)*(2*1.0)*c));
}
}
return 0;
}