之前做过一个蚂蚁问题,不过这个题目还要记录下交换之后的蚂蚁。
思路:两个蚂蚁的相撞可以看成对穿而过。只不过是两个蚂蚁的编号换了。这样之后只要判断对穿之后
哪个蚂蚁是哪个蚂蚁就行了。
#include<stdio.h> #include<algorithm> using namespace std; const int maxn=100001; struct Node { int id,p,d; bool operator<(const Node &c)const { return p<c.p; } } a[maxn],b[maxn]; int cnt[maxn]; char str[][10]= {"L","Turning","R"}; int main() { int tt,kj=1; scanf("%d",&tt); while(tt--) { int len,t,n; scanf("%d%d%d",&len,&t,&n); for(int i=0; i<n; i++) { int x,d; char s[10]; scanf("%d%s",&x,s); d=(s[0]=='L'?-1:1); b[i]=(Node) { i,x,d }; a[i]=(Node) { 0,x+t*d,d }; } sort(b,b+n); for(int i=0; i<n; i++) cnt[b[i].id]=i; sort(a,a+n); for(int i=0; i<n; i++) if(a[i].p==a[i+1].p) a[i].d=a[i+1].d=0; printf("Case #%d:\n",kj++); for(int i=0; i<n; i++) { int c2=cnt[i]; if(a[c2].p<0||a[c2].p>len) puts("Fell off"); else printf("%d %s\n",a[c2].p,str[a[c2].d+1]); } printf("\n"); } return 0; }