碰撞的小球 ccf (模拟)
生活随笔
收集整理的這篇文章主要介紹了
碰撞的小球 ccf (模拟)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
問題描述
| 試題編號: | 201803-2 |
| 試題名稱: | 碰撞的小球 |
| 時間限制: | 1.0s |
| 內存限制: | 256.0MB |
| 問題描述: | 問題描述 數軸上有一條長度為L(L為偶數)的線段,左端點在原點,右端點在坐標L處。有n個不計體積的小球在線段上,開始時所有的小球都處在偶數坐標上,速度方向向右,速度大小為1單位長度每秒。 當小球到達線段的端點(左端點或右端點)的時候,會立即向相反的方向移動,速度大小仍然為原來大小。 當兩個小球撞到一起的時候,兩個小球會分別向與自己原來移動的方向相反的方向,以原來的速度大小繼續移動。 現在,告訴你線段的長度L,小球數量n,以及n個小球的初始位置,請你計算t秒之后,各個小球的位置。 提示 因為所有小球的初始位置都為偶數,而且線段的長度為偶數,可以證明,不會有三個小球同時相撞,小球到達線段端點以及小球之間的碰撞時刻均為整數。 同時也可以證明兩個小球發生碰撞的位置一定是整數(但不一定是偶數)。 輸入格式 輸入的第一行包含三個整數n, L, t,用空格分隔,分別表示小球的個數、線段長度和你需要計算t秒之后小球的位置。 第二行包含n個整數a1, a2, …, an,用空格分隔,表示初始時刻n個小球的位置。 輸出格式 輸出一行包含n個整數,用空格分隔,第i個整數代表初始時刻位于ai的小球,在t秒之后的位置。 樣例輸入 3 10 5 4 6 8 樣例輸出 7 9 9 樣例說明 初始時,三個小球的位置分別為4, 6, 8。 一秒后,三個小球的位置分別為5, 7, 9。 兩秒后,第三個小球碰到墻壁,速度反向,三個小球位置分別為6, 8, 10。 三秒后,第二個小球與第三個小球在位置9發生碰撞,速度反向(注意碰撞位置不一定為偶數),三個小球位置分別為7, 9, 9。 四秒后,第一個小球與第二個小球在位置8發生碰撞,速度反向,第三個小球碰到墻壁,速度反向,三個小球位置分別為8, 8, 10。 五秒后,三個小球的位置分別為7, 9, 9。 樣例輸入 10 22 30 14 12 16 6 10 2 8 20 18 4 樣例輸出 6 6 8 2 4 0 4 12 10 2 數據規模和約定 對于所有評測用例,1 ≤ n ≤ 100,1 ≤ t ≤ 100,2 ≤ L ≤ 1000,0 < ai < L。L為偶數。 保證所有小球的初始位置互不相同且均為偶數。 |
?
1 #include<iostream> 2 #include<vector> 3 #include<string> 4 #include<cmath> 5 #include<algorithm> 6 #include<cstdio> 7 #include<cstring> 8 9 10 using namespace std; 11 12 int n, L, t; 13 struct node 14 { 15 int direction; // 1表示向右,-1表示向左 16 int pos; 17 }ball[110]; 18 int vis[1100]; // 存放該位置下的小球個數 19 vector<int> v[1100]; // v[i]存放i位置下的小球下標 20 21 int main() 22 { 23 scanf("%d%d%d", &n, &L, &t); 24 for(int i = 1; i <= n; ++i) 25 { 26 scanf("%d", &ball[i].pos); 27 ball[i].direction = 1; 28 } 29 30 31 for(int i = 1; i <= t; ++i) 32 { 33 memset(vis, 0, sizeof(vis)); 34 for(int j = 1; j <= n; ++j) 35 { 36 ball[j].pos += ball[j].direction; 37 vis[ball[j].pos]++; // 該位置下的球的個數加一 38 v[ball[j].pos].push_back(j); // 將該位置下的球的下標裝入vector 39 if(ball[j].pos == L) 40 ball[j].direction = -1; 41 else if(ball[j].pos == 0) 42 ball[j].direction = 1; 43 } 44 45 for(int k = 1; k <= L; ++k) 46 { 47 if(vis[k] == 2) // 該位置下有兩個小球(最多只可能有兩個小球發生碰撞) 48 { 49 ball[v[k][0]].direction = -ball[v[k][0]].direction; 50 ball[v[k][1]].direction = -ball[v[k][1]].direction; 51 } 52 } 53 for(int x = 0; x < L; ++x) 54 v[x].clear(); 55 } 56 57 for(int i = 1; i <= n-1; ++i) 58 { 59 printf("%d ", ball[i].pos); 60 } 61 62 printf("%d\n", ball[n].pos); 63 64 return 0; 65 }?
轉載于:https://www.cnblogs.com/FengZeng666/p/11474021.html
總結
以上是生活随笔為你收集整理的碰撞的小球 ccf (模拟)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: golang中创建logger时候踩过的
- 下一篇: 二分求幂 模板