算法竞赛入门经典训练指南打卡
题目链接:UVa 10881
思路
首先有以下几点:
1.由于是在直线上运动,所以蚂蚁相撞后各自沿对方之前的路线走,即可以看出对穿而过(这个大家可能都理解)
2.不管两只蚂蚁往一个方向走还是相向而行,从左往右数第1只蚂蚁永远是第一只蚂蚁,同理可得对于所有蚂蚁,从左往右数第i只永远是第i只
综上:我们可以忽略碰撞,直接计算每只蚂蚁t秒后的位置,然后按照最终位置从左往右数,第i只蚂蚁所在的位置即是初始状态第i只蚂蚁的最终位置
然后我们所需要做的就是记录下输入的顺序,最后按照顺序输出蚂蚁的位置即可
代码如下:
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std ;
struct ant{
int id ; //输入顺序
int p ; //蚂蚁的位置
char d ; //蚂蚁的方向
};
bool cmp(ant a , ant b){
return a.p < b.p ;
}
int main(){
int fre , k = 1 ;
cin >> fre ;
while (fre --){
int l , t , n ;
cin >> l >> t >> n ;
vector<ant> ants(n) ;
vector<int> order(n) ;
for(int i = 0 ; i < n ; ++ i){
ants[i].id = i ;
cin >> ants[i].p >> ants[i].d ; //一次输入蚂蚁的位置和朝向,同时给一个id
}
sort(ants.begin() , ants.end() , cmp) ; //记录下输入蚂蚁在木棍上的从左到右的顺序,并计算出所有蚂蚁最终的位置
for(int i = 0 ; i < n ; ++ i){
order[ants[i].id] = i ;
if(ants[i].d == 'R')
ants[i].p += t ;
else
ants[i].p -= t ;
}
sort(ants.begin() , ants.end() , cmp) ; //按照最终位置进行排序,使每只蚂蚁可以找到自己初始的位置顺序
cout << "Case #" << k ++ << ":" << endl ;
for(auto i : order){
if(ants[i].p == ants[i + 1].p || ants[i].p == ants[i - 1].p)
cout << ants[i].p << " Turning" << endl ; //蚂蚁正在碰撞
else if(ants[i].p < 0 || ants[i].p > l)
cout << "Fell off" << endl ; //掉下去的
else
cout << ants[i].p << " " << ants[i].d << endl ;
}
cout << endl ;
}
return 0 ;
}