找规律,模拟。
强行模拟会超时。
观察易发现,蚂蚁位置相对不变,只改变对应序号而已,不过要注意按照输入蚂蚁的顺序输出相对应蚂蚁的结果。另,仔细看条件,这次的空白行是每个测试案例之后,而非测试案例中间。
#include <bits/stdc++.h> using namespace std; const int maxn=10003; struct ant{ int a; int pre; char state; }ant[maxn]; bool cmp(struct ant a1,struct ant b1) { if(a1.a<b1.a) return true; return false; } bool cmp2(struct ant a2,struct ant b2) { if(a2.pre<b2.pre) return true; return false; } int main() { int kase; cin>>kase; for(int ii=1;ii<=kase;ii++){ //if(ii!=1) int shunxu[maxn]; int lon,time,n; cin>>lon>>time>>n; for(int i=0;i<n;i++){ cin>>ant[i].a>>ant[i].state; ant[i].pre=i; } sort(ant,ant+n,cmp); for(int i=0;i<n;i++){ shunxu[i]=ant[i].pre; } for(int i=0;i<n;i++){ if(ant[i].state=='L') ant[i].a-=time; else if(ant[i].state=='R') ant[i].a+=time; } sort(ant,ant+n,cmp); for(int i=0;i<n;i++){ ant[i].pre=shunxu[i]; } printf("Case #%d:\n",ii); sort(ant,ant+n,cmp2); for(int i=0;i<n;i++){ for(int l=0;l<n;l++){ if(i!=l&&ant[i].a==ant[l].a) { ant[i].state='T'; ant[l].state='T'; } } } for(int i=0;i<n;i++) { if(ant[i].a>lon||ant[i].a<0){ printf("Fell off\n"); continue; } if(ant[i].state!='T') printf("%d %c\n",ant[i].a,ant[i].state); else if(ant[i].state=='T') printf("%d Turning\n",ant[i].a); } cout<<endl; memset(shunxu,0,sizeof(shunxu)); memset(ant,0,sizeof(ant)); } }