zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    对象的强、软、弱和虚引用
    spark运行模式之一:Spark的local模式安装部署
    Spark Tungsten in-heap / off-heap 内存管理机制--待整理
    sparkContext之一:sparkContext的初始化分析
    mysql分区表之四:分区表性能
    服务的升级和降级
    怎样编写高质量的 Java 代码
    Java之代理(jdk静态代理,jdk动态代理,cglib动态代理,aop,aspectj)
    Spark Streaming之六:Transformations 普通的转换操作
    Spark Streaming之五:Window窗体相关操作
  • 原文地址:https://www.cnblogs.com/Taskr212/p/9453195.html
Copyright © 2011-2022 走看看