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

来源:互联网 发布:爱温士采暖知乎 编辑:程序博客网 时间:2024/06/06 05:16


题目链接
题意:

给你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<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;}
原创粉丝点击