CDOJ 木杆上的蚂蚁

这是一个关于蚂蚁在木杆上行走的问题,木杆有限长,蚂蚁相遇时会掉头继续行走,直到离开木杆。输入包含多组测试数据,包括蚂蚁数量、木杆长度和每个蚂蚁的初始位置及方向。需要求解的是蚂蚁掉下木杆的顺序和对应时间。题目给出了样例输入和输出,要求按照掉下木杆的顺序输出时间和蚂蚁名字。

http://www.acm.uestc.edu.cn/#/problem/show/300

Description
在一根细木杆上,有一些速度相同蚂蚁,它们有的往左走,有的往右走,木杆很细,只允许一只蚂蚁通过,所以当两只蚂蚁碰头的时候,它们会掉头继续前进,直到走出边界,掉下木杆。
已知木杆的长度和每只蚂蚁的名字、位置和初始方向,问依次掉下木杆的蚂蚁花费的时间以及它的名字。
Input
输入包含多组测试数据。
第一行包含一个整数T(T <= 20),代表测试数据组数。
每组测试数据的第一行包含两个整数N L,表示有N只蚂蚁(N <= 100),木杆长度为L(L <= 1000)。假设蚂蚁每秒前进一个单位距离,掉头转向的时间忽略不计。
以下N行,每行依次为蚂蚁的名字(长度不超过10,仅由英文字母组成),初始位置p(0 < p < L,整数,表示蚂蚁离木杆最左端的距离),初始方向(一个字符,L表示向左,R表示向右),以单个空格分隔,数据保证初始不会有两只蚂蚁在同一个位置。
Output
对于第k组测试数据,首先输出一行为“Case #k:”。
然后输出N行,给出依次掉下木杆的蚂蚁花费的时间以及它的名字,以单个空格分隔。
(按照掉下木杆的先后顺序输出,数据保证不会有两支蚂蚁同时掉下木杆)。
Sample Input
2
2 5
GG 1 L
2 5
GG 1 R
MM 2 L
Sample Output
Case #1:
1 GG
2 MM
2 GG
4 MM

分析:按照蚂蚁的初始位置,以及它的方向排序,可以认为蚂蚁相遇时就代替对方继续走下去。

#include <cstdio>
#include <algorithm> //因为要用sort算法
#define N 100
using namespace std; //必须引用名字空间std
struct ant_type
{
    int pos;
    char name[11];
} ants[N];
struct event_type
{
    int drop_time;
    char dir;
} events[N];
bool cmp_ant(const ant_type& p, const ant_type& q)
{
    return p.pos < q.pos;
}
bool cmp_event(const event_type& p, const event_type& q)
{    return p.drop_time < q.drop_time;
}
int main()
{
    char dir[2];
    int i, k, n, L, R, T;
    scanf("%d", &T);
    for (k = 1; k <= T; k++)
    {
        scanf("%d%d", &n, &L);
        for (i = 0; i < n; i++)
        {
            scanf("%s%d%s", ants[i].name, &ants[i].pos, dir);
            events[i].dir = dir[0];
            events[i].drop_time = (dir[0] == 'L' ? 
                                                        ants[i].pos : L - ants[i].pos);
        }        
sort(ants, ants + n, cmp_ant);
        sort(events, events + n, cmp_event);
        printf("Case #%d:\n", k);
        L = 0;        R = n - 1;
        for (i = 0; i < n; i++)
        {
            if (events[i].dir == 'L')
            {
                printf("%d %s\n", events[i].drop_time, ants[L].name);
                L++;
            }
            else
            {
                printf("%d %s\n", events[i].drop_time, ants[R].name);
                R--;
            }}}
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值