2018 Multi-University Training Contest 6 L Pinball【受力分析】

本文介绍了一种基于物理原理的运动模拟算法,该算法通过分解重力加速度来实现弹跳和匀加速直线运动的计算,并给出了具体的实现代码。通过计算不同方向上的运动周期,可以得到物体的运动轨迹。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

http://acm.hdu.edu.cn/contests/contest_showproblem.php?cid=807&pid=1012

将物体的重力加速度分解。
一部分用来做弹起运动,一部分用来做匀加速直线运动。
可以计算得出两个方向上的运动周期,两者之商为答案。

#include <iostream>
#include <stdio.h>
#include <string.h>
#include <math.h>
using namespace std;
typedef long long int LL;
const int N = 1e5 + 10;
const int mod = 998244353;
const double g = 9.8;
const double pi = acos(-1.0);
double t, vx, vy, v;
int T;
double a, b, x, y;
int main()
{
    scanf("%d",&T);
    while(T--){
        scanf("%lf%lf%lf%lf",&a,&b,&x,&y);
        t = sqrt(2.0*(y-b/a*(-x))/g);
        vx = 0; v = vy = g*t;
        int ans = 0;
        double da = atan(b/a), db = pi/2-da;
        vx = v * cos(fabs(db-da));
        vy = v * sin(fabs(db-da));
        double temp = -x;
        while(temp > 0){
            ans ++;
            if(db >= da) t = vy*2/g;
            else t = 0;
            double B = 2*(vy-b*vx/a), C = 2*b*vx*t/a;
            double tt = (-B + sqrt(B*B + 4*g*C))/2/g;
            t = t + tt;
            vy = vy + g*tt;
            temp -= vx * t;
            if(vx == 0) db = pi/2;
            else db = atan(vy/vx) - da;
            v = sqrt(vx*vx + vy*vy);
            vx = v * cos(fabs(db-da));
            vy = v * sin(fabs(db-da));
        }
        printf("%d\n", ans);
    }
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值