201803-2碰撞的小球 CCF計算機軟體能力認證考試
試題編號: | 201803-2 |
試題名稱: | 碰撞的小球 |
時間限制: | 1.0s |
記憶體限制: | 256.0MB |
問題描述: |
問題描述 數軸上有一條長度為L(L為偶數)的線段,左端點在原點,右端點在座標L處。有n個不計體積的小球線上段上,開始時所有的小球都處在偶數座標上,速度方向向右,速度大小為1單位長度每秒。 提示 因為所有小球的初始位置都為偶數,而且線段的長度為偶數,可以證明,不會有三個小球同時相撞,小球到達線段端點以及小球之間的碰撞時刻均為整數。 輸入格式 輸入的第一行包含三個整數n, L, t,用空格分隔,分別表示小球的個數、線段長度和你需要計算t秒之後小球的位置。 輸出格式 輸出一行包含n個整數,用空格分隔,第i個整數代表初始時刻位於ai的小球,在t秒之後的位置。 樣例輸入 3 10 5 樣例輸出 7 9 9 樣例說明 初始時,三個小球的位置分別為4, 6, 8。 樣例輸入 10 22 30 樣例輸出 6 6 8 2 4 0 4 12 10 2 資料規模和約定 對於所有評測用例,1 ≤ n ≤ 100,1 ≤ t ≤ 100,2 ≤ L ≤ 1000,0 < ai < L。L為偶數。 |
解題思路:定義結構體陣列,包含兩個元素——位置loc和方向dir。發生碰撞則反向可以理解為dir*=-1,位置變化時即為+dir。
程式碼如下:
#include<iostream>
#include<stdio.h>
using namespace std;
struct array
{
int loc;
int dir;
} a[1001];
int main()
{
int n, l, t, i, j, k=0;
cin >> n >> l >> t;
for (i = 0; i<n; i++)
{
a[i].dir = 1;
cin >> a[i].loc;
}
while (k<t)
{
for (i = 0; i<n; i++)
{
a[i].loc += a[i].dir;
if (a[i].loc == l||a[i].loc==0)//到達最大臨界點或者最小臨界點 反向
a[i].dir *= -1;
for (j = 0; j < n; j++)
{
if (a[i].loc == a[j].loc&&i != j)//碰撞反向
{
a[i].dir *= -1;
a[j].dir *= -1;
}
}
}
k++;
}
for (i = 0; i<n; i++)
cout << a[i].loc << " ";
return 0;
}