本题目是蚂蚁的相遇问题,蚂蚁相遇以后就反向,输出蚂蚁t秒后的次序。
这里用ne数组存下新状态的一切信息。注意交换的次序即可。
因为所有蚂蚁的相对位置不变,所以当前的相对位置也不变。
num存着所有的新位置的相对次序,即当前ne[i].loc是第几大的数字呢?num里面将这个次序分别存下来
order[i]里面则表示 大小顺序序号为i的数据将在第order[i]个输出
之后ne数组又依照数字大小进行了排序,所以此刻ne[order[i]]中的数据就是第i只蚂蚁的数据,就是应该第i个输出的数据。
然后注意方向,ne[i].dir的方向是否为turning,应该比较ne[i-1].loc与<span style="line-height: 17.6px;">ne[i].loc</span>
,最后得出方向。(如果相邻的蚂蚁的位置相等,那么意味着这两只蚂蚁相遇,都在转向了)。
#include<cstdio>
#include<cmath>
#include<algorithm>
#include<cstring>
using namespace std;
const int N=100001;
int l,t,n;
struct data
{
int loc,id;
int dir;
}d[200007],ne[N];
int num[N];
char s[3][100]={"L","Turning","R"};
bool cmp(int x,int y)
{
return d[x].loc<d[y].loc;
}
bool ccc(data a,data b)
{
return a.loc<b.loc;
}
int order[N];
int main()
{
int cas=1;
int T;
scanf("%d",&T);
while(T--)
{
printf("Case #%d:\n",cas++);
scanf("%d%d%d",&l,&t,&n);
for(int i=0;i<n;i++)
{
num[i]=i;
char ss[10];
int x;
scanf("%d%s",&x,ss);
d[i].loc=x;
d[i].id=i;
if(ss[0]=='R')
{
ne[i].loc=(x+t);
d[i].dir=ne[i].dir=1;
}
else
{
ne[i].loc=(x-t);
d[i].dir= ne[i].dir=-1;
}
}
sort(num,num+n,cmp);
for(int i=0;i<n;i++)
order[num[i]]=i;
sort(ne,ne+n,ccc);
for(int i=0;i<n-1;i++)
{
if(ne[i].loc==ne[i+1].loc)
{
ne[i].dir=ne[i+1].dir=0;
}
}
for(int i=0;i<n;i++)
{
int now=order[i];
if(ne[now].loc<0||ne[now].loc>l)
{
puts("Fell off");
}
else
{
printf("%d %s\n",ne[now].loc,s[ne[now].dir+1]);
}
}
puts("");
}
return 0;
}