avatar
fireworks99
keep hungry keep foolish

POJ 3684 Physics Experiment

Description

有n个小球从一管道开始下落,每秒钟下落一个,已知管口离地面的距离h及小球半径r,所有的碰撞均是弹性碰撞,求ts时,各个小球的位置

http://poj.org/problem?id=3684

Idea

他们的碰撞可以视为没有碰撞,只是穿过了对方,而这种思路适用于没有半径的时候,其实有半径的时候也可以这样来解决

  1. 假所有的小球都是没有半径的,且从同一高度每隔1s掉下,,很显然,这个时候求t时的小球的位置,只要求出单独的小球位置,然后再sort排个序就好,(sort排序是因为小球相对位置不变,即刚释放时最下边的小球不管怎么跳还是在最下面),这个时候跟蚂蚁是几乎差不多的,碰了等于没碰。
  2. 假设两个小球是有半径的,且是紧挨着每隔1s落下,这时候,因为小球有半径,其实碰了还是等于没碰
  3. 对于从下方数第i个球,在按照R=0计算的结果上加上2Ri就好了

Code

#include <cmath> #include <cstdio> #include <iostream> #include <algorithm> using namespace std; const double g = 10.0; int N, H, R, T; double y[105]; double cal(int t) { if(t < 0) return H; double TT = sqrt(2 * H / g); ///周期 int k = (int)(t / TT); ///最多包含多少个周期 double time; if(k & 1) ///rise time = k * TT + TT - t; else ///fall time = t - k * TT; return H - g * time * time / 2; } int main() { int n; cin >> n; while(n--) { cin >> N >> H >> R >> T; for(int i = 0; i < N; ++i) y[i] = cal(T - i); ///T-i 对应释放时间 sort(y, y + N); for(int i = 0; i < N; ++i) printf("%.2f%c", y[i] + 2 * R * i / 100.0, i < N - 1 ? ' ' : '\n'); } return 0; }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
Site by Baole Zhao | Powered by Hexo | theme PreciousJoy