B - Collisions
生活随笔
收集整理的這篇文章主要介紹了
B - Collisions
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
題目鏈接:http://acm.hust.edu.cn/vjudge/contest/view.action?cid=26830#problem/B
題目大意:直線上有n個不計半徑的球,有初始坐標和速度,給出公式,問第t秒這些球分別在哪些位置
思路:有點麻煩的水題,大致上就是每次算出兩個球相撞的最小時間mint,然后計算出mint秒后球球們分別都在什么位置,相撞的都要計算速度(注意:同一時間可能有多對球同時碰撞,我用一個WA證實了這一點……)。
還有要注意的事,比如速度相等的、位置相同的球不能用來算最小時間,理由自己想。還有算出來時間不是正數也不能要,不是正數說明兩個球沒外力干擾的情況下永遠不會相撞。
AC Code:
1 #include <cstdio> 2 #include <cmath> 3 4 const int MAXN = 110; 5 const double EPS = 1e-6; 6 7 double x[MAXN], v[MAXN]; 8 int m[MAXN]; 9 10 int main() { 11 int n, t; 12 scanf("%d%d", &n, &t); 13 for(int i = 0; i < n; ++i) 14 scanf("%lf%lf%d", &x[i], &v[i], &m[i]); 15 double nowt = 0; 16 while(true) { 17 double mint = 1e10; 18 int ix, jx; 19 for(int i = 0; i < n; ++i) { 20 for(int j = i + 1; j < n; ++j) { 21 if(fabs(v[j] - v[i]) < EPS) continue; 22 double tmpt = (x[i] - x[j]) / (v[j] - v[i]); 23 if(tmpt <= EPS) continue; 24 if(mint > tmpt) { 25 mint = tmpt; 26 //ix = i; jx = j; 27 } 28 } 29 } 30 if(nowt + mint > t) break; 31 else nowt += mint; 32 for(int i = 0; i < n; ++i) { 33 x[i] += v[i] * mint; 34 } 35 for(int i = 0; i < n; ++i) { 36 for(int j = i+1; j < n; ++j) { 37 if(fabs(x[i] - x[j]) > EPS) continue; 38 ix = i; jx = j; 39 double vix = v[ix]; 40 v[ix] = ((m[ix] - m[jx]) * v[ix] + 2 * m[jx] * v[jx]) / (m[ix] + m[jx]); 41 v[jx] = ((m[jx] - m[ix]) * v[jx] + 2 * m[ix] * vix) / (m[ix] + m[jx]); 42 } 43 } 44 } 45 for(int i = 0; i < n; ++i) { 46 x[i] += v[i] * (t - nowt); 47 } 48 for(int i = 0; i < n; ++i) printf("%f\n", x[i]); 49 }BY 區彥開
?
轉載于:https://www.cnblogs.com/scnuacm/p/3209964.html
《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀總結
以上是生活随笔為你收集整理的B - Collisions的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 嵌入式培训学习历程第三天
- 下一篇: 完成一个MVC+Nhibernate+J