Piotr's Ants
https://vjudge.net/problem/UVA-10881
一道模拟题,题意实说,一根杆上有m个蚂蚁,方向不同,给你方向,问t秒之后蚂蚁的位置。
我们知道 两只蚂蚁 相遇并且转向的话,其实就相当于对穿而过,但是每只蚂蚁的固定位置是不变的,所以每只蚂蚁移动后,按照他的位置排好序,将蚂蚁原来的位置编号重新防到现在的位置上,输出就好。
代码:
#include<bits/stdc++.h>
using namespace std;struct node{
int x;
char c;
char s;
int id;
}T[100005];
int iod[100005];
bool cmp(node a,node b){
return a.x < b.x;
}
bool cmp2(node a,node b){
return a.id < b.id;
}
int main()
{
int n;
scanf("%d",&n);
int num = 0;
while(n --){
memset(iod,0,sizeof(0));
memset(T,0,sizeof(T));
int L,t,m;
scanf("%d%d%d",&L,&t,&m);for(int i = 0; i < m; i++){//先将按位置前后排好序的蚂蚁位置编号记下来
scanf("%d %c",&T[i].x,&T[i].c);
T[i].id = i;
}
sort(T, T + m,cmp);
for(int i = 0; i < m ;i++){
iod[i] = T[i].id;
}
for(int i = 0; i < m;i++){
if(T[i].c == 'R'){
T[i].x += t;
if(T[i].x > L) T[i].s = 'F';
}
else{
T[i].x -= t;
if(T[i].x < 0) T[i].s = 'F';
}
}
sort(T,T + m, cmp);
for(int i = 0; i < m - 1 ;i ++){
if(T[i].s == 'F') continue;
else{
if(T[i].x == T[i + 1].x){
T[i].s = 'T';
T[i + 1].s = 'T';
}
}
}for(int i = 0; i < m ;i ++){//将蚂蚁的位置编号重新安排上
T[i].id = iod[i];
}sort(T,T + m, cmp2);
printf("Case #%d:\n",++num);for(int i = 0; i < m; i++){
if(T[i].s == 'F') printf("Fell off\n");
else if(T[i].s == 'T') printf("%d Turning\n",T[i].x);
else{
printf("%d %c\n",T[i].x,T[i].c);
}
}
printf("\n");
}
}