原文链接
原题链接
思路
该题灵感来自于蓝桥杯的蚂蚁感冒
这个题目。感兴趣的可以去搜索一下。
第一:无论经过多长时间,小球的相对位置时不会发生改变的。因此他们每次发生碰撞都会改变方向,因此每两个球在坐标轴上的相对位置是不会发生变化的。
第二:两个小球相撞,每个球都改变了方向,可以看作他们互相穿过了对方。
这样一来我们就可以把复杂的相撞改变方向,简化为不改变方向运动了t秒。
这一段是算t秒之后,所在的位置
int cur = (tmp+t)%(2*L);
if(cur > L){
cur = L - cur%L;
}
最后我们会得到一系列小球的位置。在v_end中存放。因为无论发生多少次碰撞,无论经过多长时间,球的相对位置是不会发生改变的。所以,可以讲初始位置和最后位置进行排序,然后就可以实现两两匹配了。
最后按原来的小球顺序,输出最后的结果。
代码
#include <bits/stdc++.h>
using namespace std;
int n,L,t,tmp;
map<int,int>pos;//记录最后的位置
int main(){
cin>>n>>L>>t;
vector<int> v_first,v_end;//初始的位置
for(int i=0;i<n;i++){
cin>>tmp;
v_first.push_back(tmp);
int cur = (tmp+t)%(2*L);
if(cur > L){
cur = L - cur%L;
}
v_end.push_back(cur);
}
vector<int> v(v_first.begin(),v_first.end());//保留原来的顺序信息
sort(v_first.begin(),v_first.end());
sort(v_end.begin(),v_end.end());//小球的最后位置
for(int i=0;i<n;i++){
pos[v_first[i]] = v_end[i];//绑定最后的位置
}
for(int i=0;i<n;i++){ //按原来顺序输出最后的小球顺序
cout<<pos[v[i]]<<" ";
}
return 0;
}