HDU 6373(斜面上小球弹跳 运动分解)

题意是给定两个点的位置,过原点引一条射线穿过第一个点,射线位置作为斜面位置,第二个点处令一小球自由落体,问小球能碰撞到斜面几次。

开始时想算出两次碰撞中小球沿斜面运动的距离,然后发现每一段距离会因为高度差导致动能不断变大,然后一脸懵......

直到看了别人的题解,才想起运动分解来(这可是高中基础知识,罪过)。

将小球受到的重力在平行于斜面和垂直于斜面方向分解,小球在平行于斜面方向做初速度为0的匀加速直线运动,在垂直于斜面方向做类自由落体(初速度为0的匀加速直线)运动,由于能量不会因碰撞而损耗,那么只要求出小球沿斜面方向运动时在斜面上方的总时间,再求出小球在垂直于斜面方向上做匀加速直线运动加匀减速直线运动(一个周期)的单次碰撞时间(因为两次运动的对称性,此处算半周期就可以),用总时间除以单次碰撞的时间就是答案。(注意第一次碰撞所花时间只有半周期的时间)

 1 #include <cstdio>
 2 #include <cmath>
 3 using namespace std;
 4 int main()
 5 {
 6     int times,n,m,ans;
 7     double a1,a2,h,x,y,a,b,t,pt,theta,g = 9.8;
 8     scanf("%d",&times);
 9     while (times--)
10     {
11         scanf("%lf%lf%lf%lf",&a,&b,&x,&y);
12         theta = atan(b/a);  //斜面与水平面的夹角
13         a1 = g * sin(theta);    //平行于斜面方向的加速度
14         a2 = g * cos(theta);    //垂直于斜面方向的加速度
15         h = (y + b/a*x) * cos(theta);   //小球到斜面的距离
16         x = (y + b/a*x) * sin(theta) + (x *(-1) / cos(theta));  //小球沿斜面方向到斜面底部的距离
17         t = sqrt(x * 2 / a1);   //小球在斜面上运动的时间
18         pt = sqrt(h * 2 / a2);  //小球从初位置到斜面的单次时间
19         if(t > pt)  //计算小球能否至少碰撞在斜面上一次
20         {
21             t -= pt;
22             ans = 1;
23         }
24         ans += t / pt / 2;  //计算小球剩余的时间能完成多少来回(即碰撞次数)
25         printf("%d
",ans);
26     }
27     return 0;
28 }
View Code
日后若能有更好的想法,再来完善。 希望看到的大神不吝赐教 orz
原文地址:https://www.cnblogs.com/Taskr212/p/9453195.html