(蓝桥杯)历届试题 蚂蚁感冒 (思维题)

题目链接:http://lx.lanqiao.org/problem.page?gpid=T119

历届试题 蚂蚁感冒  
时间限制:1.0s   内存限制:256.0MB
    
问题描述
  长100厘米的细长直杆子上有n只蚂蚁。它们的头有的朝左,有的朝右。

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

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

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

  请你计算,当所有蚂蚁都爬离杆子时,有多少只蚂蚁患上了感冒。
输入格式
  第一行输入一个整数n (1 < n < 50), 表示蚂蚁的总数。

  接着的一行是n个用空格分开的整数 Xi (-100 < Xi < 100), Xi的绝对值,表示蚂蚁离开杆子左边端点的距离。正值表示头朝右,负值表示头朝左,数据中不会出现0值,也不会出现两只蚂蚁占用同一位置。其中,第一个数据代表的蚂蚁感冒了。
输出格式
  要求输出1个整数,表示最后感冒蚂蚁的数目。
样例输入
3
5 -2 8
样例输出
1
样例输入
5
-10 8 -20 12 25
样例输出
3

解题思路:一开始一直认为这是一道模拟题,嫌他麻烦放了两天、、今天又拿出来做了一下,发现是道水题。大概是这样的:感冒蚂蚁的头一开始面向的是右的话,只要判断一下是否有蚂蚁的头要面向左,如果有还需要判断一下这个头向左的蚂蚁是否在感冒这只蚂蚁的右边,这样的话一定会碰上,输出感冒蚂蚁的个数=头向左蚂蚁右边所有的蚂蚁数+最开始感冒那只左边所有蚂蚁;否则输出1。

还有一种就是最开始感冒的那只蚂蚁是头是面向左的,和上面类似,反过来即可。


详见代码。

#include <iostream>
#include <cstdio>

using namespace std;

int abs(int a)
{
    if (a<0)
        return -a;
    return a;
}

int main()
{
    int n,st;
    int a[1010];
    int flag=0,k1,k2,k3,k4;
    while (~scanf("%d",&n))
    {
        k1=0,k2=0,k3=0,k4=0;
        scanf("%d",&st);
        for (int i=1;i<n;i++)
        {
            scanf ("%d",&a[i]);
            if (st>0)
            {
                if (a[i]<0&&abs(a[i])>st)
                    k1++;
                if (a[i]>0&&a[i]<st)
                    k2++;
            }
            else
            {
                if (a[i]>0&&a[i]<abs(st))
                    k3++;
                if  (a[i]<0&&abs(a[i])>abs(st))
                    k4++;
            }
        }
        if (st<0)
        {
            if (k3>0)
                cout<<k3+k4+1<<endl;
            else
                cout<<1<<endl;
        }
        else
        {
            if (k1>0)
                cout<<k1+k2+1<<endl;
            else
                cout<<1<<endl;
        }
    }
    return 0;
}


你可能感兴趣的:((蓝桥杯)历届试题 蚂蚁感冒 (思维题))