Greedy:Physics Experiment(弹性碰撞模型)(POJ 3848)

            

                  物理实验

  题目大意:有一个与地面垂直的管子,管口与地面相距H,管子里面有很多弹性球,从t=0时,第一个球从管口求开始下落,然后每1s就会又有球从球当前位置开始下落,球碰到地面原速返回,球与球之间相碰会发生完全弹性碰撞(各自方向改变,速率变为相碰时另一个球的速率)问最后所有球的位置?

  这一题又是一道弹性碰撞模型的题目,和Liner World有点像,但是这一题不要求输出球的名字,而是要你求得各个球的高度

  这道题我们只用明白一个道理就很方便了:

    首先我们来看一个球的情况:

 一个球从H的高度下落,碰到地面原速返回,那么他在t时刻的位置由下列方程决定:

    t=sqrt(2*H/g);

    k=(int)(T/t);

    Hi=H-(T-k*t)*(T-k*t)*g/2;    (当K是偶数)

    Hi=H-(k*t+t-T)*(k*t+t-T)*g/2;  (当K是奇数) 

  如果有两个球:

  如果第一个球没有碰地,那么两个球的高度将由Hi=H-(T-k*t)*(T-k*t)*g/2唯一确定

  如果第一个球碰地了,那么在接下来的某一时刻两个球一定会相碰且交换速度,可以看成是擦身而过,但问题还没完,如果相碰后不再相碰,要确定高度,那么究竟怎么确定呢?

  我们知道因为各个球可以看成独立的,根据题意,第2个球的高度应该要加上两个球的半径并除以100.0(单位是cm看清楚!),然后交换速度过后我们虽然2和1交换了状态,但是状态不变,我们还是可以把他们当成一个球看,但是同时注意,这两个球是有半径的!(一开始我没有想到半径打死都想出来为什么,模拟了一下才明白),最后答案为从低到高排列的小球逐次加上0和2r的高度即可(如果存在交换一定要排列,否则两个球就会重叠了就不对了)。

  把上面这两种情况推广到多个球,我们就可以得到解决方法了

  

 1 #include <iostream>
 2 #include <algorithm>
 3 #include <functional>
 4 #include <math.h>
 5
 6 using namespace std;
 7
 8 double cal(const double, const double, const double);
 9 const double g = 10.0;
10 static double h[101];
11
12 int main(void)//很巧妙的一道物理模型题
13 {
14     int case_sum, N;
15     double H, R, T, seg_t;
16     scanf("%d", &case_sum);
17
18     while (case_sum--)
19     {
20         scanf("%d%lf%lf%lf", &N, &H, &R, &T);
21         seg_t = sqrt(2 * H / g);
22
23         for (int i = 0; i < N; i++)
24             h[i] = cal(seg_t, T - i, H);//每一个间隔减少1s
25         sort(h, h + N);
26         for (int i = 0; i < N; i++)
27             printf("%.2f ", h[i] + 2 * R*i / 100.0);
28         printf("\n");
29     }
30     return EXIT_SUCCESS;
31 }
32
33 double cal(const double t, const double T, const double H)
34 {
35     if (T < 0)
36         return H;//相当于还没开始下落就直接
37     int k =(int)(T / t);//看究竟是上升阶段还是下降阶段。
38     if (k % 2 == 0)//下降阶段
39         return H - g*(T - k*t)*(T - k*t) / 2;
40     else
41         return H - g*(k*t + t - T)*(k*t + t - T) / 2;
42
43 }

  

      

时间: 2024-10-24 02:02:17

Greedy:Physics Experiment(弹性碰撞模型)(POJ 3848)的相关文章

poj 3684 Physics Experiment 弹性碰撞

Physics Experiment Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 1489   Accepted: 509   Special Judge Description Simon is doing a physics experiment with N identical balls with the same radius of R centimeters. Before the experiment,

Physics Experiment poj 3684 弹性碰撞

Language: Default Physics Experiment Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 1107   Accepted: 380   Special Judge Description Simon is doing a physics experiment with N identical balls with the same radius of R centimeters. Befor

Physics Experiment(POJ 3684)

原题如下: Physics Experiment Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 3583   Accepted: 1275   Special Judge Description Simon is doing a physics experiment with N identical balls with the same radius of R centimeters. Before the exper

POJ3684 Physics Experiment 【物理】

Physics Experiment Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 1031   Accepted: 365   Special Judge Description Simon is doing a physics experiment with N identical balls with the same radius of R centimeters. Before the experiment,

POJ3684-Physics Experiment 弹性碰撞

Physics Experiment Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 3576   Accepted: 1270   Special Judge Description Simon is doing a physics experiment with N identical balls with the same radius of R centimeters. Before the experiment,

POJ 3684 Physics Experiment

和蚂蚁问题类似. #include<cstdio> #include<cstring> #include<cmath> #include<vector> #include<queue> #include<algorithm> using namespace std; int c,n; double h,r,t,T; double ans[105]; double cal(double time) { if(time<=0) re

北大ACM3684——Physics Experiment

这题,题目的意思是,有N个球从高度为H的地方落下,每一秒落下一个球,球与球之间和球与地板直接都是弹性碰撞,求T秒后的每个球的位置,也就是高度. 这题,跟Ants那题类似,也就是球与球碰撞可以当作不转换方向,继续按照原来的方向.也就是R = 0的时候,忽略半径,算出每一个球的位置,每一个球与地板碰撞后,会上升到原来的高度.先算出一次掉落需要t = sqrt(2 * H / g):每个球总共的时间T,总共的完整的来回有k = T / t次. k为奇数,最终高度为H - g * (k * t + t

Greedy:萨鲁曼军队(POJ 3069)

2015-09-06 北大神奇的萨鲁曼军队 问题大意:萨鲁曼白想要让他的军队从sengard到Helm’s Deep,为了跟踪他的军队,他在军队中放置了魔法石(军队是一条线),魔法石可以看到前后距离为R的距离,为了让魔法石发挥最大的效益,魔法石戴在军人的身上,问你怎么才能使用最少的石头 问题很清晰,思路也很清晰,这道题挺典型的,就是贪心算法, 很容易想到的就是我们只用在距离内找到最后的点(人),然后把魔法石放到其上面就行了,然后依次类推,最后就可以达到最少的数量 具体可以以2R为一次循环,在前R

弹性碰撞 poj 3684

Simon is doing a physics experiment with N identical balls with the same radius of R centimeters. Before the experiment, all N balls are fastened within a vertical tube one by one and the lowest point of the lowest ball is H meters above the ground.