[HDU5826] physics [2016 Multi-University Training Contest 8(2016多校联合训练8) 1006]

题意

数轴上给出一些点的初始速度 vi ,初始位置 Xi ,初始方向 Di ,质量相同的质点。
在每个时刻 viai=C ,其中 vi 为速度, ai 为加速度, C 为给定的常数。
每次询问第t时刻,第 k 小的速度是什么。碰撞为完全弹性碰撞。

题解

由于碰撞为完全弹性碰撞,相撞的两球交换方向和速度,可以看做互相穿过,那么这道题给出的Xi Di 没什么卵用。

略微思考可以相处在所有的时刻,质点的速度的大小关系是不会改变的(其中将碰撞视为互相穿过),可以较为直观地脑补一下,画出满足 va=C vt 图像,这个图像是单增的,不同的 vi 在图中对应着不同的点,过去相同时刻后速度大小关系还是不变。

于是我们将初始速度从小到大排序,询问的 t k就是询问第 k 小的速度经过t时刻后变成多少,也就是解决这个问题:给定 v0,C,t ,满足 v0a=C ,求 vt

我们用的不定积分

a=cv

dv=adt=cvdt

vdv=cdt

左右同时积分可得
12v2t=ct+C

其中C为不定积分中的常量,结合题目可得 C=12v20
12v2t=ct+12v20

v2t=2ct+v20

vt=2ct+v20

同学用的动能定理的方法

av=c

对每个时刻功率 P
P=Fv=mav=mc

P 为固定值,由动能定理得
Pt=12mv2t12mv20=mct

整理得
vt=2ct+v20

代码

#include <bits/stdc++.h>
using namespace std;
typedef double DB;

int n, c;
const int maxn = 1e5 + 100;
int a[maxn];

int main() {
    int T;
    scanf("%d", &T);
    while (T--) {
        scanf("%d %d", &n, &c);
        for (int i = 1; i <= n; ++i)
            scanf("%d %*d%*d", &a[i]);
        sort(a + 1, a + n + 1);
        int q;
        scanf("%d", &q);
        while (q--) {
            int t, k;
            scanf("%d %d", &t, &k);
            int x = a[k];
            printf("%.3lf\n", sqrt(2.0 * c * t + 1.0 * x * x));
        }
    }
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值