2018 Multi-University Training Contest 6 L Pinball【受力分析】
阿新 • • 發佈:2018-12-24
將物體的重力加速度分解。
一部分用來做彈起運動,一部分用來做勻加速直線運動。
可以計算得出兩個方向上的運動週期,兩者之商為答案。
#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;
}