題目
問題描述
提示
因為所有小球的初始位置都為偶數,而且線段的長度為偶數,可以證明,不會有三個小球同時相撞,小球到達線段端點以及小球之間的碰撞時刻均為整數。
同時也可以證明兩個小球發生碰撞的位置一定是整數(但不一定是偶數)。
輸入格式
輸入的第一行包含三個整數n, l, t,用空格分隔,分別表示小球的個數、線段長度和你需要計算t秒之後小球的位置。
第二行包含n個整數a1, a2, …, an,用空格分隔,表示初始時刻n個小球的位置。
輸出格式
輸出一行包含n個整數,用空格分隔,第i個整數代表初始時刻位於ai的小球,在t秒之後的位置。
樣例輸入
3 10 5
4 6 8
樣例輸出
7 9 9
思路
剛看到題的時候覺得很複雜,因為給出的示例分析過程有點繞。當時困擾的有以下幾個點:
1)乙個球只會與它附近的兩個球相互撞擊,或者跟牆撞。因為球一撞就會**,並且球的速度是始終一致的。所以球初始是什麼順序,最後也是順序(包括兩個相鄰球停留在同一位置)
2)球的初始位置是無序的,那麼確定那幾個球互相撞擊,是否還得先排個序?先排序就還得建立乙個用來儲存序號的變數陣列。
3)既然要儲存這麼多資訊(包括球的位置、方向、序號),是不是還得建乙個結構體?還是直接用乙個int陣列,正負號表示方向,如果這樣那前進後退這裡怎麼簡單處理。
4)由於所有的球最初方向和速度都一致,需要產生碰撞必須是最右邊的球先撞到了牆上,然後回彈過程中產生一系列的連帶反應。那麼是否要先找到初始位置最右的這個球,再處理這個碰撞的球。那怎麼處理這個球呢?如果是這種思路,處理順序是怎麼樣的呢?畢竟球是在同乙個時間點發生動作的。。。
這些問題困擾得我始終無法動筆,繞不出乙個清晰的思路。
後來想著畢竟是第二題,應該也沒有這麼複雜吧。。。
那麼先以最簡單的辦法開始寫一點,就建立乙個球的位置陣列和方向陣列,先處理當球撞牆時的情況,不撞牆就繼續前進(前進或後退根據方向(1/-1)來決定,加減就好),然後考慮碰撞,考慮碰撞也十分簡單,就只需要考慮當兩個球在同乙個位置時反向就可以了。
總之,這個題目,由於速度不變,唯一需要考慮的就是不碰撞就按著方向加1或者減1繼續走;碰到牆就直接自己反向;碰撞就反向---如何確定碰撞---兩個球處於同乙個位置(題目分析說了只可能存在兩球碰撞)。
題解
#includeusingnamespace
std;
intmain()
//t個時刻
while(t--)
a[i]=a[i]+adir[i];
}//球碰撞的情況,只有不同方向才可能碰撞,所以不考慮別的,只需要處理撞後反向即可
for(int i=0;i) }}
}for(int i=0;i)
return0;
}
180302碰撞的小球
問題描述 提示因為所有小球的初始位置都為偶數,而且線段的長度為偶數,可以證明,不會有三個小球同時相撞,小球到達線段端點以及小球之間的碰撞時刻均為整數。同時也可以證明兩個小球發生碰撞的位置一定是整數 但不一定是偶數 輸入格式 輸入的第一行包含三個整數n,l,t,用空格分隔,分別表示小球的個數 線段長度...
CCF 碰撞的小球
201803 2 碰撞的小球 時間限制 1.0s 記憶體限制 256.0mb 問題描述 因為所有小球的初始位置都為偶數,而且線段的長度為偶數,可以證明,不會有三個小球同時相撞,小球到達線段端點以及小球之間的碰撞時刻均為整數。同時也可以證明兩個小球發生碰撞的位置一定是整數 但不一定是偶數 輸入格式 輸...
CCF 20180302小球碰撞
include using namespace std 1.首先進行排序 結構體陣列的排序 2.結果的輸出 不是根據change i id 的1 n的輸出,而是根據其下邊的1 n來輸出 struct nodechange 102 int main 結構體陣列排序 for int i 1 ifor i...