UVa 10881打卡

算法竞赛入门经典训练指南打卡

题目链接: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 ;
}

猜你喜欢

转载自blog.csdn.net/just_gong/article/details/107867913
今日推荐