题意,长度为L的木棒上有n只蚂蚁,每只蚂蚁要么向左,要么向右,相撞的时候则会改变方向,问T秒后,妈妈的位置和方向
这道题我们把蚂蚁抽象成一个个点来的话,我们会发现,蚂蚁碰撞之后,就像两个点“对穿而过:所以我们要计算出T秒后每个蚂蚁的位置
但是T秒过后对应的位置上不一定是那只蚂蚁,可能是别的蚂蚁。我们就要搞清楚”谁是谁“
通过模拟发现,蚂蚁经过T时间之后,相对顺序是不变的。所以我们把前后的位置排个序。则移动后的从左到右的顺序还是从左到右。但输入的时候并不是从左到右,所以我们还要用一个order数组记录输入的顺序
AC代码如下:
#include<stdio.h> #include<iostream> #include<math.h> #include<algorithm> using namespace std; const int maxn=10000+100; const char dirName[][10]={"L","Turning","R"}; int order[maxn]; struct node { int id; int p; int d; }; bool cmp(node A,node B) { return A.p<B.p; } node b[maxn],a[maxn]; int main() { int t,n,cas=0,T,L; scanf("%d",&t); while(t--) { scanf("%d %d %d",&L,&T,&n); for(int i=0;i<n;i++) { int x; char ch; int p; scanf("%d %c",&x,&ch); int d=(ch=='L'?-1:1); b[i].id=i; b[i].p=x; b[i].d=d; a[i].id=0; a[i].p=x+T*d; a[i].d=d; } sort(b,b+n,cmp); for(int i=0;i<n;i++) order[b[i].id]=i; sort(a,a+n,cmp); for(int i=0;i<n-1;i++) { if(a[i].p==a[i+1].p) { a[i].d=a[i+1].d=0; } } printf("Case #%d:\n",++cas); for(int i=0;i<n;i++) { int s=order[i]; if(a[s].p<0||a[s].p>L) printf("Fell off\n"); else printf("%d %s\n",a[s].p,dirName[a[s].d+1]); } printf("\n"); } return 0; }