一根长度为L厘米的木棍上有n个蚂蚁,每个蚂蚁要么朝左爬,要么朝右爬,速度为1厘米/秒,当两只蚂蚁相撞时,二者同时掉头,给出每只蚂蚁的初始位置和朝向,计算T秒之后每只蚂蚁的位置
每组数据的第一行输入L,T,n,其中x表示蚂蚁距离木棍的距离,字母表示初始朝向,若T秒之前已经掉下木棍的蚂蚁输出Fell off(turning表示正在碰撞)
#include <iostream>
#include <algorithm>
#include <cstring>
#include <cstdio>
using namespace std;
struct node
{
int i;//输入的顺序
int x;//蚂蚁距离木棍左端的距离
int t;//初始朝向
}Node[10005],after[10005];
const char dirName[][10]={"L","Turning","R"};
int cmp(node a,node b)
{
return a.x<b.x;
}
int order[10005];//表示输入的第i只蚂蚁是终态的左数第order[i]只蚂蚁
int main()
{
int L,T,n;
int m;
while(cin>>m)
{
for(int k=1;k<=n;k++)
{
cin>>L>>T>>n;
cout<<"Case #"<<k<<endl;
char r;
for(int i=0;i<n;i++)
{
cin>>Node[i].x;
cin>>r;
Node[i].i=i;
Node[i].t=(r=='L'?-1:1);
after[i].i=0;
after[i].x=Node[i].x+T*Node[i].t;
after[i].t=Node[i].t;
}
sort(Node,Node+n,cmp);
for(int i=0;i<n;i++)
{
order[Node[i].i]=i;
}
sort(after,after+n,cmp);
for(int i=0;i<n-1;i++)//修改碰撞中的蚂蚁的朝向
{
if(after[i].x==after[i+1].x)
after[i].t=after[i+1].t=0;
}
for(int i=0;i<n;i++)//修改结果
{
int a=order[i];
if(after[a].x<0||after[a].x>L)
cout<<"Fell off"<<endl;
else
cout<<after[a].x<<" "<<dirName[after[a].t+1]<<endl;
}
cout<<endl;
}
}
return 0;
}
所有蚂蚁的相对顺序是不变的,因此把所有目标位置从小到大排序,则从左到右的每个位置对应于初始状态下从左到右的每只蚂蚁,但是还要预处理计算出输入中的第i只蚂蚁的序列order[ i ];