• UVa10881 Piotr's Ants【模拟】


    问题链接UVa10881 Piotr's Ants

    问题简述

    一根长L厘米的木棍上有n只蚂蚁,已知每只蚂蚁有个开始的位置和爬行方向,速度为1。当两只蚂蚁相撞后,两者同时掉头继续爬行,求按输入顺序输出每只蚂蚁T秒后的位置和朝向。

    问题分析

    蚂蚁碰头后,仍然是一只往左另一只往右,所以可以看作是各自继续行走。

    T秒后位置,有可能变为负或大于木棍的长度,那就是掉落了。

    不按照位置进行排序,就无法知道T秒后哪些蚂蚁调头。

    过T秒后,蚂蚁的相对位置是不变的,所以按照之前的顺序进行输出即可。

    程序说明:(略)

    参考链接:(略)

    题记:(略)


    AC的C++程序如下:

    /* UVa10881 Piotr's Ants */
    
    #include <iostream>
    #include <cstdio>
    #include <algorithm>
    
    using namespace std;
    
    const char *dirname[] = {"L", "Turning", "R"};
    
    const int N = 10000;
    struct _ant {
        int no;         // 序号
        int pos;        // 位置
        int direction; // 方向:0-2(dirname)
        bool operator < (const _ant& a) const {
            return pos<a.pos;
        }
    } before[N], after[N];
    int order[N];
    
    int main()
    {
        int allcase, l, t, n, pos;
        char direction;
    
        scanf("%d", &allcase);
        for(int k=1; k<=allcase; k++) {
            printf("Case #%d:
    ", k);
    
            scanf("%d%d%d", &l, &t, &n);
    
            for(int i=0; i<n; i++) {
                scanf("%d %c", &pos, &direction);
    
                before[i] = _ant{i, pos, (direction == 'L' ? 0 : 2)};
                after[i] = _ant{0, pos + (direction == 'L' ? -t : t), (direction == 'L' ? 0 : 2)};
            }
    
            // 按蚂蚁位置排序
            sort(before, before + n);
            for(int i=0; i<n; i++)
                order[before[i].no] = i;
    
            // 计算终止状态:按蚂蚁位置排序,如果相邻位置相同则置为掉头状态
            sort(after, after + n);
            for(int i=0; i<n-1; i++)
                if(after[i].pos == after[i + 1].pos)
                    after[i].direction = after[i + 1].direction = 1;
    
            // 输出结果
            for(int i=0; i<n; i++) {
                int j = order[i];
    
                if(after[j].pos < 0 || after[j].pos > l)
                    printf("Fell off
    ");
                else
                    printf("%d %s
    ", after[j].pos, dirname[after[j].direction]);
            }
            printf("
    ");
        }
    
        return 0;
    }



  • 相关阅读:
    基于java容器注解---基于泛型的自动装配
    mininet+floodlight搭建sdn环境并创建简单topo
    Bean装配之@Autowired注解
    Linux常用命令
    Bean利用Resource接口获取资源的几种方式
    MYSQL分页优化查询
    MYSQL统计和识别重复值
    MYSQL统计和识别重复值
    MYSQL处理数据重复值
    MYSQL处理数据重复值
  • 原文地址:https://www.cnblogs.com/tigerisland/p/7563768.html
Copyright © 2020-2023  润新知