Question
https://uva.onlinejudge.org/external/108/10881.pdf
Evolution
思路
- 在图上演示后,可以发现,当两只蚂蚁发生碰撞后,两只蚂蚁将会沿着对方的路线走,也就是说,如果不管它们的身份,那么这两只蚂蚁等同于没有碰撞.因此,我们能够获得T秒后蚂蚁应该存在的位置.
- 由于蚂蚁碰到障碍物(蚂蚁)就会反弹,很明显木棒上的蚂蚁的相对位置是不变的,因此,我们可以记录输入时蚂蚁初始时的相对位置,输出时参照这一顺序输出.
Need to be awared
蚂蚁可以站在木棒的起点,也即position=0和position=l的时候蚂蚁都没有掉落
Code
#include<cstdio>
#include <algorithm>
#include <iostream>
using namespace std;
#define MAXN 10004
int ind[MAXN];
struct Ant{
int pos;
int ind;
int dir;
}a[MAXN];
bool cmp(Ant a1,Ant a2){
if(a1.pos!=a2.pos)return a1.pos < a2.pos;
return a2.dir > a1.dir;
}
bool cmpind(Ant a1,Ant a2){
return a1.ind < a2.ind;
}
int main(){
//freopen("out.txt", "w", stdout);
int T;
scanf("%d",&T);
for(int ti = 1;ti <= T;ti++){
int l,t,n;
scanf("%d%d%d",&l,&t,&n);
for(int i = 0;i < n;i++){
char op[2];
scanf("%d%s",&(a[i].pos),op);
if(op[0]=='L'){
a[i].dir = -1;
}else{
a[i].dir = 1;
}
a[i].ind = i;
}
sort(a,a+n,cmp);
for(int i = 0;i < n;i++){
ind[i] = a[i].ind;
}
for(int i = 0;i < n;i++){
a[i].pos = a[i].pos + a[i].dir * t;
}
sort(a,a+n,cmp);
for(int i = 0;i < n;i++){
a[i].ind = ind[i];
if((i > 0 && a[i].pos == a[i - 1].pos) || (i < n - 1&& a[i].pos == a[i+1].pos)){
a[i].dir = 0;
}
}
sort(a,a+n,cmpind);
cout<<"Case #"<<ti<<":"<<endl;
for(int i = 0;i < n;i++){
if(a[i].pos < 0 ||a[i].pos > l){\The ant can stand on where pos = 0
cout<<("Fell off")<<endl;
}else {
cout<<a[i].pos<<" "<<(a[i].dir==1?"R":(a[i].dir == 0?"Turning":"L"))<<endl;
}
}
cout<<endl;
}
return 0;
}