HDU 5826 2016多校联赛 第八场1006

意: 

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


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值