题目来源
碰撞的小球
注意点
- 输入数据可能是无序的。
- 输出时需要按照输入时小球的顺序来输出他们的位置。
代码
#include <iostream>
#include <algorithm>
#include <map>
#include <vector>
using namespace std;
struct Node{
int loc;
int dir;
};
vector<Node> nodes;
bool cmp(Node a, Node b) {
return a.loc < b.loc;
};
int main() {
int N,L,T;
cin>>N>>L>>T;
for (int i = 0; i < N; ++i) {
int cur;
cin>>cur;
nodes.push_back(Node{cur, 1});
}
map<int, int> mymap1, mymap2;
for (int i = 0; i < N; ++i) {
mymap1[nodes[i].loc] = i;
}
sort(nodes.begin(), nodes.end(), cmp);
for (int i = 0; i < N; ++i) {
mymap2[nodes[i].loc] = i;
}
int indexs[N];
int index = 0;
for (pair<int, int> p: mymap2) {
indexs[index++] = mymap1[p.first];
}
for (int i = 0; i < T; ++i) {
Node nxtnodes[1002];
for (int j = 0; j < N; ++j) {
if (nodes[j].loc == 0 ) {
nxtnodes[j].loc = 1;
nxtnodes[j].dir = 1;
}
else if (nodes[j].loc == L) {
nxtnodes[j].loc = L - 1;
nxtnodes[j].dir = -1;
}
else {
nxtnodes[j].loc = nodes[j].loc + nodes[j].dir;
nxtnodes[j].dir = nodes[j].dir;
}
}
for (int j = 0; j < N; ++j) {
if (j < N - 1 && nxtnodes[j].loc == nxtnodes[j + 1].loc) {
nodes[j].loc = nxtnodes[j].loc;
nodes[j + 1].loc = nxtnodes[j + 1].loc;
nodes[j].dir = -1;
nodes[j + 1].dir = 1;
++j;
}
else {
nodes[j].loc = nxtnodes[j].loc;
nodes[j].dir = nxtnodes[j].dir;
}
}
}
int ans[N];
for (int i = 0; i < N; ++i) {
ans[indexs[i]] = nodes[i].loc;
}
for(int i = 0; i < N; ++i) {
cout<<ans[i]<<" ";
}
cout<<endl;
return 0;
}