POJ_3684_Physics Experiment_だんせいしょうとつ

1819 ワード

この世界は奇妙だ
タイトル:
n個の全く同じ半径rの小球、最下部の小球の底部は地面の高さからhで、t=0から、1妙ごとに1個の小球を落下して、小球の間、小球と地面の間の衝突はすべて弾性の衝突で、t秒後に各小球の底部の高さを求めて、下から上への順序で出力します.
Input
The first line of the input contains one integer C (C ≤ 20) indicating the number of test cases. Each of the following lines contains four integers N, H, R, T. 1≤ N ≤ 100. 1≤ H ≤ 10000 1≤ R ≤ 100 1≤ T ≤ 10000
Output
For each test case, your program should output N real numbers indicating the height in meters of the lowest point of each ball separated by a single space in a single line. Each number should be rounded to 2 digit after the decimal point.
この問題は一見簡単だと思ったが,それから2日間穴をあけられた.
まず最初の機知点であり、弾性衝突であり、ボールが同じであるため、交換速度は、地面衝突とは逆方向であり、このような衝突交換速度の場合、弾性衝突と呼ばれることが多い.
2つ目の機知点は、交換速度ですが、2つのボールには直径があり、触れると瞬時にdを移動することに相当します.しかし、i番目のボールの下にi-1個のボールがあり、1周期でi-1個のdを下に瞬時にシフトすると、i-1個のdを高さで減少させることに相当し、hから落下し、上に上がることに相当する.これにより、まず各球に周期以外の時間をかけて、単一球のみを考慮した位置を算出し、最終的にi番目の球の下に必ずi-1個の球があるので、最終的な高さにi-1個のdを加えるべきである
そして3番目の機知点で、私は5つのvim対拍を開いた.2つのボールが衝突することを考慮すると、2つのボールが位置速度を交換したのと同じですが、下のボール番号は上のボールよりも大きいので、下のボールが最後に追加したdの数は必然的に上のボールより小さいですが、もしこの時に結果を調べたらどうしますか?これは明らかに不合理だ.最終的なソートはdを付けていない場合にソートし、対応するdを加えるべきである.
コードは次のとおりです.
#include
#include
#include
#include
#include
#include
using namespace std;
#define mxn 110
int n;
double h,r,t;
double loc[mxn];
const double g=10.0;
int main(){
	int cs;
	scanf("%d",&cs);
	while(cs--){
		scanf("%d%lf%lf%lf",&n,&h,&r,&t);
		r/=100;
		double tt=sqrt(2*h/g)*2;
		for(int i=0;i