突然开始看刘汝佳的训练指南了,顺便刷一遍Uva,顺便写一下题解。。。
闲的没事干从头开始刷,就有了这道水题,很常见的一道题,POJ上也有。
解这道题大概的思路就是,对于相遇的两只蚂蚁,不需要管转向的问题,直接让它们穿过去就可以了,也就是说,对于所有的位置而言,都不用考虑具体是哪只蚂蚁。
因为无论在那个时刻,蚂蚁之间的相对位置都不会发生变化,所以用算出来的结束位置sort后得到的相对位置就是一开始时的相对位置,按顺序赋值即可。
这道题有一点要注意,输入没有按照坐标顺序输入。
//made by Hero_of_Someone
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<algorithm>
#define il inline
#define RG register
using namespace std;
il int gi(){ RG int x=0,q=1; RG char ch=getchar(); while( ( ch<'0' || ch>'9' ) && ch!='-' ) ch=getchar();if( ch=='-' ) q=-1,ch=getchar(); while(ch>='0' && ch<='9') x=x*10+ch-48,ch=getchar(); return q*x; }int T,t,L,m,n,ID[10010];
struct Ants{int id,x,dir;il bool operator<(const Ants &a)const{return x<a.x;}
}a[10010],b[10010];il void init(){printf("Case #%d:\n",t);L=gi(),m=gi(),n=gi();for(RG int i=1;i<=n;i++){RG int x=gi(); RG char c=getchar();RG int d=(c=='L'?-1:1);a[i]=(Ants){i,x,d};b[i]=(Ants){0,x+d*m,d};}sort(a+1,a+n+1);for(RG int i=1;i<=n;i++) ID[a[i].id]=i;
}char dir[][10]={"L","Turning","R"};il void work(){sort(b+1,b+n+1);for(RG int i=1;i<=n;i++)if(b[i].x==b[i+1].x) b[i].dir=b[i+1].dir=0;for(RG int i=1;i<=n;i++){RG int x=ID[i];if(b[x].x<0||b[x].x>L) puts("Fell off");else printf("%d %s\n",b[x].x,dir[b[x].dir+1]);}puts("");
}int main(){ T=gi(); for(t=1;t<=T;t++){ init(); work(); } return 0; }