CCF计算机软件能力认证试题练习:201803-2 碰撞的小球
碰撞的小球
來源:CCF
標簽:
參考資料:
相似題目:
題目
數軸上有一條長度為L(L為偶數)的線段,左端點在原點,右端點在坐標L處。有n個不計體積的小球在線段上,開始時所有的小球都處在偶數坐標上,速度方向向右,速度大小為1單位長度每秒。
當小球到達線段的端點(左端點或右端點)的時候,會立即向相反的方向移動,速度大小仍然為原來大小。
當兩個小球撞到一起的時候,兩個小球會分別向與自己原來移動的方向相反的方向,以原來的速度大小繼續移動。
現在,告訴你線段的長度L,小球數量n,以及n個小球的初始位置,請你計算t秒之后,各個小球的位置。
輸入
輸入的第一行包含三個整數n, L, t,用空格分隔,分別表示小球的個數、線段長度和你需要計算t秒之后小球的位置。
第二行包含n個整數a1, a2, …, an,用空格分隔,表示初始時刻n個小球的位置。
輸出
輸出一行包含n個整數,用空格分隔,第i個整數代表初始時刻位于ai的小球,在t秒之后的位置。
輸入樣例1
3 10 5
4 6 8
輸出樣例1
7 9 9
輸入樣例2
10 22 30
14 12 16 6 10 2 8 20 18 4
輸出樣例2
6 6 8 2 4 0 4 12 10 2
樣例說明
提示
因為所有小球的初始位置都為偶數,而且線段的長度為偶數,可以證明,不會有三個小球同時相撞,小球到達線段端點以及小球之間的碰撞時刻均為整數。
同時也可以證明兩個小球發生碰撞的位置一定是整數(但不一定是偶數)。
對于所有評測用例,1 ≤ n ≤ 100,1 ≤ t ≤ 100,2 ≤ L ≤ 1000,0 < ai < L。L為偶數。
保證所有小球的初始位置互不相同且均為偶數。
解題思路
首先我們需要知道,在經過t時間之后,小球的相對位置是不變的,比如最左邊的小球經過t時間之后,還是在最左邊。其次,我們需要理解兩個小球相撞的過程,小球A沿正方向,和小球B沿負方向相撞后,兩個小球將沿著與原方向相反的方向前進,也就是說A沿負方向,B沿正方向。不妨理解為兩個小球發生了穿透,但是A成為了B,B成為了A,繼續沿著原來的方向前進。這樣想來,便可以輕松得到這些小球在經過t時間之后的位置。
參考代碼
#include<stdio.h> #include<algorithm> #define MAXN 105 using namespace std; struct Ball{int index; //序號 int order; //相對位置int pos; }ball[MAXN];bool cmp_order(Ball a, Ball b){return a.pos<b.pos; }bool cmp_index(Ball a, Ball b){return a.index<b.index; }int main(){int n,L,t;scanf("%d%d%d",&n,&L,&t);for(int i=0;i<n;i++){scanf("%d",&ball[i].pos);ball[i].index=i;}int tmp[MAXN]={0}; //tmp[i]為第i個小球在t時間之后的位置for(int i=0;i<n;i++){tmp[i]=ball[i].pos+t;//計算t時間之后在數軸上的位置//通過判斷tmp[i]是奇數個L長度,還是偶數個L長度,計算到零點的距離if((tmp[i]/L)%2==1) tmp[i]=L-tmp[i]%L; else tmp[i]=tmp[i]%L;} sort(tmp,tmp+n); //按照位置從小到大對這些小球排序,由于相對位置不變,tmp[i]表示相對位置為i的小球所在的距離 sort(ball,ball+n,cmp_order); //按照相對位置對原來的小球進行排序for(int i=0;i<n;i++){ball[i].order=i;}sort(ball,ball+n,cmp_index); //還原為按序號排序,按要求輸出 for(int i=0;i<n;i++){printf("%d ",tmp[ball[i].order]);}return 0; }總結
以上是生活随笔為你收集整理的CCF计算机软件能力认证试题练习:201803-2 碰撞的小球的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python中文模糊关键词提取_如何用P
- 下一篇: VUE + Jquery 集成的一个简易