POJ 3684 Physics Experiment(弹性碰撞)
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了POJ 3684 Physics Experiment(弹性碰撞)相关的知识,希望对你有一定的参考价值。
题目链接:http://poj.org/problem?id=3684
题意:N个半径为R的小球放在距离地面H高度的管道里,从0秒释放一个小球开始,每秒钟释放一个小球,问最后每个小球距离地面多远(按高度从低到高输出)
题解:先不考虑半径关系,直接模拟过程,两个小球如果碰撞反弹相当于穿过,直接可以计算就可以了,然后分一下奇数偶数判断是向下还是向上,处理一下。
1 #include <cmath> 2 #include <cstdio> 3 #include <algorithm> 4 using namespace std; 5 6 const double g=10.0; 7 int C,N,H,R,T; 8 double res[111]; 9 10 double cal(int time){ 11 if(time<0) return 1.0*H; 12 double t=sqrt(2.0*H/g); 13 int k=(int)(1.0*time/t); 14 if(k%2){ 15 double d=k*t+t-1.0*time; 16 return 1.0*H-0.5*g*d*d; 17 } 18 else{ 19 double d=1.0*time-k*t; 20 return 1.0*H-0.5*g*d*d; 21 } 22 } 23 24 void solve(){ 25 for(int i=0;i<N;i++){ 26 res[i]=cal(T-i); 27 } 28 sort(res,res+N); 29 for(int i=0;i<N;i++){ 30 if(i==0) printf("%.2f",res[i]+2.0*i*R/100.0); 31 else printf(" %.2f",res[i]+2.0*i*R/100.0); 32 } 33 printf("\n"); 34 } 35 36 int main(){ 37 scanf("%d",&C); 38 while(C--){ 39 scanf("%d %d %d %d",&N,&H,&R,&T); 40 solve(); 41 } 42 return 0; 43 }
以上是关于POJ 3684 Physics Experiment(弹性碰撞)的主要内容,如果未能解决你的问题,请参考以下文章
POJ3684-Physics Experiment 弹性碰撞
POJ 3684 Physics Experiment(弹性碰撞)