算法竞赛入门经典例题-蚂蚁

转载 2015年07月07日 11:45:35

题目描述:一根长度为L的木棍上有n只蚂蚁,每只蚂蚁要么朝左爬,要么朝右爬,速度为1厘米/秒。二者同时掉头,给出每只蚂蚁的初始位置和朝向,计算T秒之后每只蚂蚁的位置。

输入格式:
输入的第一行为数据组数。每组数据的第一行为3个正整数L,T,n(0<=n<=10000);以下n行每行描述一只蚂蚁的初始位置。其中,整数x为蚂蚁距离左端的距离(单位:厘米),字母表示朝向(L表示朝左,R表示朝右)

输出格式:
对于每组数据,输出n行,按输入顺序输出每只蚂蚁的位置和朝向(Turning 表示正在碰撞)。在第T秒之前已经掉下木棍的蚂蚁(正好爬到木棍边缘的不算)输出Fell off

样例输入:
2
10 1 4
1 R
5 R
3 L
10 R
10 2 3
4 R
5 L
8 R

样例输出:
Case #1:
2 Turning
6 R
2 Turning
Fell off

Case #2:
3 L
6 R
10 R

*分析:每只蚂蚁在木棍上都有自己的相对位置, 如果两只蚂蚁碰头就会改变自己的朝向,所以他们在木棍上的相对位置是不会改变的,给所有蚂蚁的位置标记大小并从小到大排序,设置初始数组和终态数组表示蚂蚁的状态,设置一个order数组表示蚂蚁被放置进去的顺序,在输出结果的时候根据这个顺序输出,

#include<cstdio>
#include<algorithm>
using namespace std;

const int maxn=10000+5;

const char dirName[][10]={"L","Turning","R"};

struct Ant{
    int id; //输入顺序
    int p;  //位置
    int d;  //朝向 -1 0 1
    bool operator <(const Ant& a) const{
        return p<a.p;
    }
}before[maxn],after[maxn];


int order[maxn];
int main()
{
    int k=0;
    scanf("%d",&k);
    //开始状态和结束状态

    for(int kase=1;kase<=k;kase++)
    {
        int L,T,n;

        scanf("%d%d%d",&L,&T,&n);

        for(int i=0;i<n;i++)
        {
            int p,d;
            char c;

            scanf("%d%c",&p,&c);
            d=(c=='L'?-1:1);
            before[i]=(Ant){i,p,d};
            after[i]=(Ant){0,p+T*d,d};
        }

    //计算order数组
    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;

    printf("Case #%d:\n",kase);
    //输出结果
    for(int i=0;i<n;i++)
    {
        int a=order[i];
        if(after[a].p<0||after[a].p>L)
            printf("Fell off\n");
        else
            printf("%d %s\n",after[a].p,dirName[after[a].d+1]);
    }
    printf("\n");
    }
    return 0;
}

要注意的是,为什么要用到order数组,因为终态数组没有输入顺序,在最后输出结果的时候需要按照这个order把结果顺序输出。

碰撞的时候记为0,向左为-1,向右为1。

相关文章推荐

蚂蚁-UVA 10881 - Piotr's Ants

题目:一根长度为L厘米的木棍上有n只蚂蚁,每只蚂蚁要么朝左爬, 要么朝右爬,速度为1厘米/秒。当两只蚂蚁相撞时,二者同时 掉头(掉头时间忽略不计)。给出每只蚂蚁的初始位置和朝向, 计算T秒之后每...

蚂蚁问题 每日一练(一)

蚂蚁 一根长度为L厘米的木棍上有n只蚂蚁,每只蚂蚁要么朝左爬,要么朝右爬,速度为1厘米/秒。当两只蚂蚁相撞时,二者同时掉头(掉头时间忽略不计)。给出每只蚂蚁的初始位置和朝向,计算T秒之后每只蚂蚁...

算法竞赛入门经典训练指南(1)

问题: 一根长度为L厘米的木棍上有n只蚂蚁,每只蚂蚁要么朝左爬,要么朝右爬,速度为1厘米/秒。当两只蚂蚁相撞时,二者同时掉头(掉头时间忽略不计)。给出每只蚂蚁的初始位置和朝向,计算T秒之后每只蚂蚁的...
  • wdhxek
  • wdhxek
  • 2015年12月22日 20:55
  • 391

Delphi7高级应用开发随书源码

  • 2003年04月30日 00:00
  • 676KB
  • 下载

学习笔记-POJ-1852蚂蚁问题

Description 一支蚂蚁军队在长度为L厘米的横竿上走,每只蚂蚁的速度恒定,为1厘米/秒。当一只行走的蚂蚁到达模竿终点的时候,它就立即掉了下去;当两只蚂蚁相遇的时候,它们就调头,并开始往相反的...
  • Node_Su
  • Node_Su
  • 2017年04月23日 15:18
  • 306

算法竞赛入门经典:第6章例题

例题1:模拟并行程序的运行,采取双端队列来运行。主要考虑到以下几个逻辑问题:(1)(1)首先要注意当前剩下的时间是不是还够运行该条命令。不够的话就要结束当前的循环且不能删除该条命令。即便是end命令可...

算法竞赛入门经典 例题 9-7 最优三角剖分

/* 算法竞赛入门经典 例题 9-7 最优三角剖分 * f(i,j)定义为:从顶点i到顶点j所构成的子多边形的最大三角剖分权和 * 三角形权值为三个顶点权值之和 * f(i,j) = max{f...

算法竞赛入门经典 第二版 例题6-5 移动盒子 Boxes in a Line uva12657

题目:https://vjudge.net/problem/UVA-12657 思路:题目很短也很好理解,但题目时限要求较高,uva上的题目时限大多是3s,这题1s,起初我用STL的list...

算法竞赛入门经典(第2版)例题4-6 师兄帮帮忙 (A Typical Homework UVa 12412)

这道例题书上要求自己补全daim有个bug卡了我
  • archya
  • archya
  • 2014年08月02日 08:07
  • 1513

《算法竞赛入门经典2ndEdition 》例题5-5 集合栈计算机(The SetStack Computer, Uva12096)

这道题一开始,根本就没有理解题意,看了半天Sample,一直傻傻地觉得Sample是错的,后来才意识到集合中相同的元素只能有一个,所以第五行是1,而不是2。于是理解了题意之后,瞬间思路被打开了,加上这...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:算法竞赛入门经典例题-蚂蚁
举报原因:
原因补充:

(最多只允许输入30个字)