題解: 模擬每一秒鐘的變化即可,模擬每一次時都要預先去判斷當前有沒有兩個小球以及相遇並且方向相反,若相遇了,則需要將它的方向改變一下,變為相反的方向,然後再對每個小球進行加1操作,分情況討論: 1、朝右走,沒有走到頭,則直接++,走到頭的話,則方向變為-1, 位置–;2、朝左走,沒有到達起點,則直接–, 到達起點的話,則改變為相反的方向,位置++即可;
注意點:
預處理初始小球方向為1
預處理碰撞時,要記得防止重複,即下面的兩個for迴圈,j 的起始要從k 開始,可以保證處理的資料不會有重複,而不是從0開始,eg: 處理了 3 -> 5, 下次還會處理 5 -> 3, 所以從k 開始可以有效解決重複問題。
for
(int k =
0; k < n; k++
)for
(int j = k; j < n; j++
)
#include
#include
#include
#include
using
namespace std;
int n, l, t;
struct node
;node s[
110]
;int
main()
}}for(
int i =
0; i < n; i++
)else}}
for(
int i=
0; i < n; i++
) cout << s[i]
.a <<
" ";
return0;
}
CCF 201803 2 碰撞的小球
問題描述 提示因為所有小球的初始位置都為偶數,而且線段的長度為偶數,可以證明,不會有三個小球同時相撞,小球到達線段端點以及小球之間的碰撞時刻均為整數。同時也可以證明兩個小球發生碰撞的位置一定是整數 但不一定是偶數 輸入格式 輸入的第一行包含三個整數n,l,t,用空格分隔,分別表示小球的個數 線段長度...
CCF201803 2 碰撞的小球
解決方案 使用陣列pos i 儲存第i個球的初始位置 使用陣列step i 儲存第i個球現在的運動方向,step i 1表示向右走,step i 1表示往左走,用加法運算就可以實現小球的移動。模擬過程是按照時間序列,先計算小球的下乙個位置,如果該位置為兩端則改變運動方向。再根據小球的新位置看看有沒有...
CCF 201803 2 碰撞的小球
思路 1.用陣列 a i j 記錄第 i 時刻第 j 個小球的位置,此處用的 i,j 編號均從零開始。2.用陣列 dir j 記錄第 j 個小球的方向,dir j 1 或 dir j 1 初始化為 1,因為小球初始時都向右移。3.如果小球相撞或碰到邊緣,就修改小球運動的方向,即令 dir j dir...