2018 Multi-University Training Contest 6--HDU 6373 Pinball

題意:

求出小球在斜面反彈幾次。

題解:

通過對速度的直角座標系分解,我們可以知道沿着斜面方向的初速度爲 v0 = sqrt(2*g*H) * Sin(a) (2gH = v0*v0 - 0*0),然後對重力進行分解可以得到沿着斜面方向的力及可以得到其方向的加速度 a = g * Sin(a)。

對於垂直斜面方向的速度,一直處於上升和下降,每次下降都會碰到一次,把小球對斜面的力看作這個垂直方向的加速度,我們就可以把他當作向上拋小球動作,其上升時間和下降時間是一樣的,與沿斜面方向的速度沒有關係,所以每次碰到斜面的時間都是一樣的,所以我們可以得出 v0*count*time+0.5*g*Sin*pow(time*count,2) == x/Cos(a) (count 是反彈時間次數,x/Cos(a)是小球第一次在斜面上到(0,0)的總距離,公式:S = v0*t + 1/2 * a * t^2)。

比賽時,敲了一份迷之WA的代碼0.0,難受了。

#include <algorithm>
#include  <iostream>
#include   <cstdlib>
#include   <cstring>
#include    <cstdio>
#include    <string>
#include    <vector>
#include    <bitset>
#include     <stack>
#include     <cmath>
#include     <deque>
#include     <queue>
#include      <list>
#include       <set>
#include       <map>
#define mem(a) memset(a, 0, sizeof(a))
#define pi acos(-1)
using namespace std;
typedef long long ll;


int main(){
    int T;
    scanf("%d", &T);
    for(int t = 1; t <= T; t++){
        double a, b, x, y;
        double g = 9.8;
        scanf("%lf %lf %lf %lf", &a, &b, &x, &y);
        double Sin = b/sqrt(a*a+b*b), Cos = a/sqrt(a*a+b*b);
        x = abs(x);
        double H = y - b*x/a;
		double v0 = sqrt(2*g*H)*Sin;
		double time = 2*sqrt(2*g*H)/g;
		int count = 1;
		while(v0*count*time+0.5*g*Sin*pow(time*count,2) < x/Cos){
			count++;
		}
		printf("%d\n", count);
    }
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章