一根长度为L厘米的木棍上有n只蚂蚁,每只蚂蚁要么朝左爬,要么朝右爬,速度为1厘米/秒。当两只蚂蚁相撞时,二者同时掉头(掉头时间忽略不计)。给出每只蚂蚁的初始位置和朝向,计算T秒之后每只蚂蚁的位置。
Input
输入的第一行为数据组数。每组数据的第一行为3个正整数L,T,n(0<=n<=10000);以下n行每行描述一只蚂蚁的初始位置。其中,整数x为蚂蚁距离左端的距离(单位:厘米),字母表示朝向(L表示朝左,R表示朝右)
Output对于每组数据,输出n行,按输入顺序输出每只蚂蚁的位置和朝向(Turning 表示正在碰撞)。在第T秒之前已经掉下木棍的蚂蚁(正好爬到木棍边缘的不算)输出Fell off
样例输入:2
10 1 4
1 R
5 R
3 L
10 R
10 2 3
4 R
5 L
8 R
Case #1:
2 Turning
6 R
2 Turning
Fell off
Case #2:
3 L
6 R
10 R
思路:蚂蚁的碰撞可以当作对穿而过,所以蚂蚁的位移等于路程。又因为蚂蚁的相对位置不会改变,比如第一位的蚂蚁,在T时间后,它依然是在第一。他们的相对排法不会改变。
#include<algorithm>
#include<string.h>
#include<stdio.h>
#define M 10010
using namespace std;
int v,l,t,m;
struct ant
{
int id,p,f;
int operator < (ant a)
{
return p<a.p;
}
}befor[M],after[M];
int mark[M];
char str[][10]={"L","Turning","R"};
int main()
{
scanf("%d",&v);
int ph=1;
while(v--)
{
scanf("%d%d%d",&l,&t,&m);
for(int i=1;i<=m;i++)
{
int p,d;
char c;
scanf("%d %c",&p,&c);
d=(c=='L'?-1:1);
befor[i]=(ant){i,p,d};
after[i]=(ant){i,p+t*d,d};
}
sort(befor+1,befor+m+1);
for(int i=1;i<=m;i++)
mark[befor[i].id]=i;
sort(after+1,after+m+1);
for(int i=2;i<=m;i++)
{
if(after[i].p==after[i-1].p)
after[i].f=after[i-1].f=0;
}
printf("Case #%d:\n",ph++);
for(int i=1;i<=m;i++)
{
int pi=mark[i];
if(after[pi].p>=0&&after[pi].p<=l)
{
printf("%d %s\n",after[pi].p,str[after[pi].f+1]);
}
else
printf("Fell off\n");
}
printf("\n");
}
}