UVa 10881 Piotr’s Ants
题目大意:
在L长的木棍上有n只蚂蚁,向左或右爬,速度为1单位长度每秒,若两蚂蚁撞上,则掉头,求T秒以后各蚂蚁所在位置,若掉下去,输出”Fell off”,否则输出位置和朝向,若此时正撞上,朝向输出”Turning”.
题目分析:
这道题还是有一些思维含量的.实际上,n只蚂蚁在爬行过程中,其相对位置(也就是第几号位置)是不会改变的,所以可以不考虑对撞之后换方向的问题,直接理解为对穿过去.那么实际问题就只有相对位置了,排序就可以解决了.
代码:
#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;
const int maxn=10000+10;
const char dirname[][10]={"L","Turning","R"};//便于朝向输出
struct Ant {
int id,dir,pos;//id表示输入编号,dir表示朝向 -1->L,1->R,0->Turning,pos表示位置
Ant(){id=dir=pos=0;}
Ant(int id,int dir,int pos):id(id),dir(dir),pos(pos){}
bool operator < (const Ant& rhs) const {
return pos<rhs.pos;
}
void input(int x) {
char ch;
scanf("%d %c",&pos,&ch);
dir=(ch=='L'?-1:1);id=x;
}
}bef[maxn],aft[maxn];//爬行前后
int order[maxn];//相对位置
int main()
{
int T,kase=0;
scanf("%d",&T);
while(T--) {
int L,t,n;
scanf("%d%d%d",&L,&t,&n);
for(int i=0;i<n;i++) {
bef[i].input(i);
aft[i]=Ant(0,bef[i].dir,bef[i].pos+bef[i].dir*t);//之后位置相对位置编号未知,朝向不变
}
sort(bef,bef+n);
for(int i=0;i<n;i++) order[bef[i].id]=i;
sort(aft,aft+n);
for(int i=1;i<n;i++) if(aft[i].pos==aft[i-1].pos) aft[i].dir=aft[i-1].dir=0;//考虑是否处于对撞状态
printf("Case #%d:\n",++kase);
for(int i=0;i<n;i++) {
int a=order[i];
if(aft[a].pos<0||aft[a].pos>L) printf("Fell off\n");//是否掉出木棍
else printf("%d %s\n",aft[a].pos,dirname[aft[a].dir+1]);
}
printf("\n");
}
return 0;
}