1. 程式人生 > >2018 Multi-University Training Contest 6 L Pinball【受力分析】

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

將物體的重力加速度分解。
一部分用來做彈起運動,一部分用來做勻加速直線運動。
可以計算得出兩個方向上的運動週期,兩者之商為答案。

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