试题编号: 201803-2
试题名称: 碰撞的小球
时间限制: 1.0s
内存限制: 256.0MB
思路:纯纯模拟题,小球只能和两边小球相撞,遍历就行了,要么撞两边反弹,要么和左右相撞反弹
注意给的样例可能不是按从左到右的顺序,按照位置排个序进行模拟,最后再按初始给的顺序重新排序,输出各自的位置就行了
AC代码:
#include<bits/stdc++.h>
using namespace std;
struct ball{
int id,pos=0, direction = 1;
}bl[110];
int n, L, t;
bool cmp(struct ball bl1, struct ball bl2){
return bl1.pos < bl2.pos;
}
bool cmp1(struct ball bl1, struct ball bl2){
return bl1.id < bl2.id;
}
int main(){
cin >> n >> L >> t;
for(int i = 1;i <= n;i++) cin >> bl[i].pos,bl[i].id = i;
sort(bl+1, bl+n+1, cmp);
while(t--){
for(int i = 1;i <= n;i++){
bl[i].pos += bl[i].direction;
if(bl[i].pos == L || bl[i].pos == 0) bl[i].direction *= -1;
else if(bl[i].pos == bl[i-1].pos) bl[i].direction *= -1, bl[i-1].direction *= -1;
else if(bl[i].pos == bl[i+1].pos) bl[i].direction *= -1, bl[i+1].direction *= -1;
}
}
sort(bl+1, bl+n+1, cmp1);
for(int i = 1;i <= n;i++) cout << bl[i].pos << " ";
}