题目大意:有n只蚂蚁在一根长度为L的木棍上,这n只蚂蚁有的向左移动有的向右移动,如果两只蚂蚁相碰的话,这两只蚂蚁就会按相反方向继续前进,每只蚂蚁的移动速度为1m/s,问T秒后每只蚂蚁的状态和所在的位置

解题思路:按从木棒的从左到右排序,T秒后,每只蚂蚁在木棒上的从左到右的位置是不变,这样的话,就可以确定每只蚂蚁最终位置,因为相碰的话,就会按反方向运动,这样的话就相当于两只蚂蚁交换移动,剩下的移动交给另一只蚂蚁来完成,其最终的位置是不变的,只是由另一只蚂蚁完成了而已,这样的话,由从左到右的顺序,就可以确定每只蚂蚁的最终位置和状态了

#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
#define maxn 10010

char status[3][10] = {"L","Turning","R"};
int f[maxn];
struct Ants{
	int id;
	int pos;
	int dir;
	bool operator <(const Ants t) const {
		return pos < t.pos;	
	}
}start[maxn], end[maxn];

int main() {
	int test, L, T, N, mark = 1; 
	scanf("%d",&test);
	while(test--) {
		scanf("%d%d%d",&L, &T, &N);
		char c;
		int s, e , dir;
		for(int i = 0; i < N; i++) {
			scanf("%d %c",&s, &c);
			f[i] = i;
			dir = (c == 'L' ? -1:1);
			e = s + dir * T;
			start[i] = (Ants){i,s,dir};
			end[i] = (Ants){0,e,dir};

		}
	
		sort(start,start+N);

		for(int i = 0; i < N; i++)
			f[start[i].id] = i;

		sort(end,end+N);
		for(int i = 0; i < N - 1; i++)
			if(end[i].pos == end[i+1].pos)
				end[i].dir = end[i+1].dir = 0;

		int t;
		printf("Case #%d:\n",mark++);
		for(int i = 0; i < N; i++) {
			t = f[i];
			if(end[t].pos < 0 || end[t].pos > L) 
				printf("Fell off\n");
			else
				printf("%d %s\n",end[t].pos, status[end[t].dir+1]);
		}

		printf("\n");
	}
	return 0;
}