LQ0212 蚂蚁感冒序列处理

Posted 海岛Blog

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LQ0212 蚂蚁感冒序列处理相关的知识,希望对你有一定的参考价值。

题目来源:蓝桥杯2014初赛 C++ A组G题

题目描述
长 100 厘米的细长直杆子上有 n 只蚂蚁。它们的头有的朝左,有的朝右。

每只蚂蚁都只能沿着杆子向前爬,速度是 1 厘米/秒。

当两只蚂蚁碰面时,它们会同时掉头往相反的方向爬行。

这些蚂蚁中,有 1 只蚂蚁感冒了。并且在和其它蚂蚁碰面时,会把感冒传染给碰到的蚂蚁。

请你计算,当所有蚂蚁都爬离杆子时,有多少只蚂蚁患上了感冒。

输入描述

第一行输入一个整数 n (1<n<50), 表示蚂蚁的总数。

接着的一行是 n 个用空格分开的整数 Xi (−100<Xi <100),Xi的绝对值,表示蚂蚁离开杆子左边端点的距离。正值表示头朝右,负值表示头朝左,数据中不会出现 0 值,也不会出现两只蚂蚁占用同一位置。其中,第一个数据代表的蚂蚁感冒了。

输出描述
要求输出 1 个整数,表示最后感冒蚂蚁的数目。

输入输出样例
示例
输入

3
5 -2 8

输出

1

问题分析
本题似乎是一个模拟题,用模拟的方法来做应该是没有问题的,但是比较复杂且慢。
本题要点整理如下:

  1. 开始时,只有第一只蚂蚁感冒;
  2. 蚂蚁碰头后掉头,也可以看作相互穿越;
  3. 跟第一只感冒蚂蚁碰头的蚂蚁也会感冒;
  4. 蚂蚁移动是有方向的;
  5. 统计那些跟感冒蚂蚁相向而行的蚂蚁,它们必定跟感冒的蚂蚁碰头;
  6. 跟感冒蚂蚁相向而行的蚂蚁,有可能在其左边也可能在其右边,需要看感冒蚂蚁的运动方向,也要看一般蚂蚁的运动方向。

AC的C语言程序如下:

/* LQ0212 蚂蚁感冒 */

#include <stdio.h>
#include <stdlib.h>

int main()

    int n, a0, a;
    int l = 0, r = 0;
    scanf("%d%d", &n, &a0);
    for (int i = 2; i <= n; i++) 
        scanf("%d", &a);
        if (a > 0 && abs(a) < abs(a0)) l++;
        if (a < 0 && abs(a) > abs(a0)) r++;
    
    if ((a0 > 0 && r == 0) || (a0 < 0 && l == 0))
        printf("1\\n");
    else
        printf("%d\\n", l + 1 + r);

    return 0;

以上是关于LQ0212 蚂蚁感冒序列处理的主要内容,如果未能解决你的问题,请参考以下文章

蚂蚁感冒 -- 蓝桥杯

SDNU 1206.蚂蚁感冒 代码如此简单,思维练习7月29

2504: 蚂蚁感冒

POJ1852 Ants

蓝桥杯 蚂蚁感冒

蚂蚁感冒---第五届蓝桥杯真题