废话不多说,上代码:
// An highlighted block
#include<iostream>
#include<algorithm>
using namespace std;
int main() {
int n, l, t;
cin >> n >> l >> t;
int a[100];
int b[100];
for (int i = 0; i < n; i++) { cin >> a[i]; b[i] = 1; }
int c[100];
int pos=0;
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
if (a[i] > a[j]) pos++;
}
c[i] = pos;
pos = 0;
}
sort(a, a + n);
while (t > 0) {
for (int i = 0; i < n; i++) {
if (a[i] == a[i + 1]) {
int c = b[i];
int d = b[i + 1];
b[i] = d;
b[i + 1] = c;
}
if (a[i] < l && b[i] == 1&&a[i]>=0) a[i]++;
else if(a[i]>0&&b[i]==0)a[i]--;
else if (a[i] == l && b[i] == 1) { b[i] = 0; a[i]--; }
else if (a[i] == 0 && b[i] == 0) { b[i] = 1; a[i]++; }
}
t--;
}
for (int i = 0; i < n; i++)
cout << a[c[i]] << " ";
return 0;
}
评测结果:
大致思路:
易得,排序过的原始数据中,只有相邻的两个小球才会发生碰撞,也就是说,初始位置更小的球无论经过多久,它的位置数据依旧是最小的,于是处理碰撞小球时,仅考虑相邻小球的状态变化就可以了!除此之外就是既不发生碰撞也不碰到边界的情况 和碰到左右边界的情况的处理。只要捋清思路,这个题就很简单啦!
祝各位旗开得胜hhhhh!