问题描述
- 数轴上有一条长度为L(L为偶数)的线段,左端点在原点,右端点在坐标L处。有n个不计体积的小球在线段上,开始时所有的小球都处在偶数坐标上,速度方向向右,速度大小为1单位长度每秒。
- 当小球到达线段的端点(左端点或右端点)的时候,会立即向相反的方向移动,速度大小仍然为原来大小。
- 当两个小球撞到一起的时候,两个小球会分别向与自己原来移动的方向相反的方向,以原来的速度大小继续移动。
- 现在,告诉你线段的长度L,小球数量n,以及n个小球的初始位置,请你计算t秒之后,各个小球的位置。
分析
- 小球到两端时需要反向。
- 小球不会再两端碰撞。
- 小球移动后,相应位置球数加一。
- 移动完一轮之后,遍历小球位置,如果此位置有多个球,此球反向。
代码
#include <iostream>
#include <vector>
using namespace std;
int main()
{
int n,L,t;
cin >> n >> L >> t;
vector<int> loc,dire;
int tmp;
for(int i = 0;i < n;i ++)
{
cin >> tmp;
loc.push_back(tmp);
if(tmp == L)
dire.push_back(-1);
else
dire.push_back(1);
}
for(int i = 0;i < t;i ++)
{
vector<int> has(L + 1);
for(int i = 0;i < n;i ++)
{
loc[i] += dire[i];
has[loc[i]] += 1;
if(loc[i] == L)
dire[i] = -1;
else if(loc[i] == 0)
dire[i] = 1;
}
for(int i = 0;i < n;i ++)
{
if(has[loc[i]] > 1)
dire[i] *= -1;
}
}
for(int i = 0;i < n;i ++)
{
cout << loc[i] << " ";
}
return 0;
}