题意:
一根长度为L的木棍上有n只蚂蚁,每只蚂蚁要么往左爬,要么往右爬,速度为1cm/s。当两只蚂蚁相遇时,二者同时掉头,爬到木棍顶端的蚂蚁掉下。给出每只蚂蚁的初始位置和朝向,计算t秒后每只蚂蚁的位置。
思路:
蚂蚁相遇掉头和不掉头继续爬,在整体上没有任何区别,所以只需计算每只蚂蚁t秒后的位置,并确定是哪一只蚂蚁就好。因为题目说明蚂蚁相遇后会掉头,所以蚂蚁的相对位置是不变的,因此把所以蚂蚁目标位置从小到大排序,则从左到右的每个位置对应初始状态下从小到大的每只蚂蚁。
代码:
#include <iostream>
#include <algorithm>
#include <cmath>
#define endl "\n"
using namespace std;
typedef long long ll;
const int N = 10010;
struct point{
int id, n, t;
}b[N], a[N];
bool cmp(point a, point b) {
return a.n < b.n;
}
string s[] = {"L", "Turning", "R"};
int main()
{
int T, l, t, n;
cin>>T;
for(int i=1; i<=T; i++) {
cout<<"Case #"<<i<<':'<<endl;
cin>>l>>t>>n;
char c;
int x;
for(int i=0; i<n; i++) {
cin>>x>>c;
b[i] = (point){i, x, c == 'L' ? -1 : 1};
}
sort(b, b + n, cmp);
int index[N];
for(int i=0; i<n; i++)
index[b[i].id] = i;
for(int i=0; i<n; i++)
a[i] = (point){0, b[i].n + b[i].t * t, b[i].t};
sort(a, a + n, cmp);
for(int i=1; i<n; i++) {
if(a[i].n == a[i-1].n)
a[i].t = a[i-1].t = 0;
}
for(int i=0; i<n; i++) {
int x = index[i];
if(a[x].n < 0 || a[x].n > l)
cout<<"Fell off"<<endl;
else
cout<<a[x].n<<' '<<s[a[x].t+1]<<endl;
}
cout<<endl;
}
}