日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

B - Collisions

發布時間:2025/7/14 编程问答 21 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。