hdu 5826 physics 物理+数学微分方程


题目链接
题意:

给你n个小球,这些小球有起始的位置和方向,然后还有一个常数C,小球的瞬时速度和加速度满足av=C,然后有q次查询,问你在t秒后速度第k小的小球的速度。小球碰撞的时候是完全弹性碰撞


思路:

首先套普及一下完全弹性碰撞:
完全弹性碰撞的意思就是两个小球相撞后没有损失二者交换速度.
如果两个小球相向而行,那么两个小球互相交换速度,且保持原来另一个小球的方向运动.
如果一个运动的小球撞静止的小球,那么静止的小球以它的速度运动,另一个求静止.
同样的如果两个球同样的方向运动,但是后面的速度大,赶上的前面的小球,那么二者交换速度,前面小球的速度就比后面小球的速度快了.

这个题目会联想到POJ那个蚂蚁的题目,也就是对这个题目来说不需要去管小球碰撞,所有的速度是不变的(前提是a*v = c),相对大小也是不变的.
也就是说原本是第几小还是第几小.根据这个性质我们可以排个序然后求t秒后速度.
a = dv/dt 又根据v*a = c 得出
v*dv = c*dt .两边同时积分得 v’ = (v0v0+2ct)

#include

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;
}

你可能感兴趣的:(hdu 5826 physics 物理+数学微分方程)