1. 程式人生 > >POJ 3684 Physics Experiment(彈性碰撞)

POJ 3684 Physics Experiment(彈性碰撞)

names -- 題意 space clas res org pre target

題目鏈接: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(彈性碰撞)