蚂蚁感冒

Posted mabeytang

tags:

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

问题描述

  长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

Algorithm

看过一本书,[挑战程序设计竞赛(第2版)].巫泽俊.(提取码:w81q)

里面有一个问题是:

技术图片

 

灵感便源于此,我们这样考虑一下,两只蚂蚁从两端往中间爬,相撞之后分别掉头,这时把他看作是擦肩而过会发现,其实是一样的,因此我们就不用考虑掉头的问题。

想明白之后会发现代码异常的简单。


AC 

技术图片
 1 #include<iostream>
 2 #include<cstring>
 3 #include<cmath>
 4 
 5 using namespace std;
 6 
 7 const int MAX = 51;
 8 int n = 0;
 9 
10 int fun(int *a)
11 {
12     int c = 1;
13     int r, l; r = l = 0;
14     if(a[0] > 0){ // 往右 
15         for(int i=1;i<n;i++){
16             if(abs(a[i]) > abs(a[0]) && a[i] < 0)
17                 r++; // 右边感冒蚂蚁的数目 
18             if(abs(a[i]) < abs(a[0]) && a[i] > 0)
19                 l++;
20         }    
21         c = (r == 0)?1:c+l+r; // 往右没有被传染的蚂蚁,左边也不可能被传染 
22         return c; 
23     } 
24     else{    // 往左  a[0] < 0
25         for(int i=1;i<n;i++){
26             if(abs(a[i]) < abs(a[0]) && a[i] > 0)
27                 l++;
28             if(abs(a[i]) > abs(a[0]) && a[i] < 0)
29                 r++;
30         }
31         c = (l == 0)?1:c+l+r;
32         return c;
33     }
34 }
35 
36 int main()
37 {
38     int a[MAX];
39     memset(a, 0, sizeof(a));
40     while(cin>>n)
41     {
42         for(int i=0;i<n;i++) cin>>a[i];
43         cout<<fun(a)<<endl;
44     }
45     return 0;
46 }
View Code

2019-02-05

18:55:04













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

蚂蚁感冒

蚂蚁感冒 -- 蓝桥杯

2504: 蚂蚁感冒

LQ0212 蚂蚁感冒序列处理

蓝桥杯 蚂蚁感冒

感冒病毒