题意:
一个水平面,给出n只蚂蚁的速度和方向,求一定时间后各蚂蚁的位置和方向
思路:
蚂蚁相撞后是会掉头的,所以从始至终他们相对的大概位置不会变,那么一开始排在前面的蚂蚁如果没掉下去还是在前面,turing表示正在碰撞,所以用一个order数组存第i号蚂蚁在第几位,最后用after存蚂蚁运动后的状态,由于排过序,所以下标就是第几位,最后依据order逐号求出蚂蚁的状态。
#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;
int l, t, n;
struct node {
int id;
int pos;
int dir;
bool operator < (const node& a)const {
return pos < a.pos;
}
} before[10005], after[10005];
int order[10005];
char dirname[][10] = {"L", "Turning", "R"};
int main() {
int cas;
int tcase = 0;
scanf("%d", &cas);
while(cas--) {
int p, d;
char c;
printf("Case #%d:\n",++tcase);
scanf("%d%d%d", &l, &t, &n)
for(int i=0; i<n; i++)
{
int p, d;
char c;
scanf("%d %c",&p,&c);
d=(c=='L'?-1:1);
before[i]=(node){i,p,d};
after[i]=(node){0,p+t*d,d}; //所有的蚂蚁相撞后可以看做对穿而过
}
sort(before,before+n);
for(int i=0; i<n; i++) //最巧妙的地方在这里,第一次从左到右所有的蚂蚁的相对位置没有变化
order[before[i].id]=i;
sort(after,after+n);
for(int i=0; i<n-1; i++)
if(after[i].pos==after[i+1].pos) after[i].dir=after[i+1].dir=0;
for(int i=0; i<n; i++) {
int t = order[i];
if(after[t].pos <= l && after[t].pos>=0) {
printf("%d %s\n", after[t].pos, dirname[after[t].dir+1]);
}
else printf("Fell off\n");
}
printf("\n");
}
return 0;
}