UVa10881题解报告
程序员文章站
2024-03-18 23:51:46
...
题目:L长的棍子上有n个蚂蚁,他们分别向左或右爬,速度为1,求T时间后各蚂蚁的状态
题解:白书给出了一个很巧妙的解法,将蚂蚁看作质点,相撞掉头等于对穿而过。因为掉头所以,他们最后的顺序与输入时在棍子上的顺序相同。所以只要记录下初始状态下蚂蚁的顺序,算出结束后的位置后根据上面的顺序输出就可以了。这个思想真变态!
AC代码:
//#define DEBUG
#include<iostream>
#include<cmath>
#include<cstdlib>
#include<cstdio>
#include<algorithm>
#define MAX 10010
#define ll long long ;
using namespace std;
struct Ant
{
int id;//输入顺序
int p;//位置
int d;//朝向 -1:左,0:转向,1:右
bool operator < (const Ant & a)const {
return p < a.p;
}
}before[MAX],after[MAX];
int order[MAX];//记录顺序
int main() {
ios::sync_with_stdio(false);
int k,count=0;
cin >> k;
int p, d, id;
char tmp;
while (k--) {
int L, T, n;
cin >> L >> T >> n;
for(int i=0;i<n;i++){
cin >> p >> tmp;
d = (tmp == 'L' ? -1 : 1);
before[i]= Ant({i,p,d });
after[i] = Ant({ 0, p + T * d, d });//id要等到sort完,p+T*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].p == after[i+1].p)
after[i].d = after[i+1].d = 0;//置碰撞中的蚂蚁
std::cout<<"Case #"<< ++count << ":\n";
int a;
for (int i = 0; i < n; i++) {
a = order[i];
if (after[a].p<0 || after[a].p>L)//掉出去
cout << "Fell off\n";
else {
cout << after[a].p<<' ';
switch (after[a].d)
{
case -1:cout << "L\n"; break;
case 0:cout << "Turning\n"; break;
case 1:cout << "R\n"; break;
}
}
}
cout << '\n';
}
#ifdef DEBUG
system("pause");
#endif // DEBUG
return 0;
}
上一篇: 1036 跟奥巴马一起编程