WooKinson

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

 

问题描述
  长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 <bits/stdc++.h> 
 2 using namespace std;
 3 
 4 bool cmp(int x,int y)
 5 {
 6     return abs(x)<abs(y);
 7 }
 8 
 9 int main(void)
10 {
11     int n;
12     int arr[100+1];    
13     cin >> n;
14     for (int i=0 ; i<n ; i++)
15     {
16         cin >> arr[i];
17     }
18     int virus = arr[0];    //记录感冒的蚂蚁 
19     sort(arr,arr+n,cmp);
20     for (int i=0 ; i<n ; i++)//查找排序后,感冒蚂蚁的位置 
21         if (arr[i] == virus)
22         {
23             virus = i;
24             break;
25         }
26     
27     
28     int l=0,r=0;
29     for (int i=virus+1 ; i<n ; i++)
30         if (arr[i]<0)//往左走的蚂蚁: <<-
31             l ++;
32             
33     for (int i=0 ; i<virus ; i++)
34         if (arr[i]>0)//往右走的蚂蚁: ->>
35             r ++;
36     
37     int res = 1;//感冒的蚂蚁本体 
38     if (arr[virus]>0 && l>0)//如果蚂蚁前进(->>),并存在反向行走的蚂蚁时(将感染) 
39         res += (l+r);        
40         
41     if (arr[virus]<0 && r>0)//如果蚂蚁前进(<<-),并存在反向行走的蚂蚁时(将感染) 
42         res += (l+r);        
43     
44     cout << res;
45     
46     return 0;
47 }
C++解法

 

解题思路:

在感冒蚂蚁的前进方向上,如果存在方向相反的蚂蚁,则这些蚂蚁及其反方向的蚂蚁都会被感染

1.对蚂蚁的数据,按绝对值进行排序

2.查找与分别在蚂蚁的左右区域上,[向左走] 和 [向右走] 的蚂蚁数量

3.根据蚂蚁的前进走向( 左 or 右 ),判断在其方向上是否有与其反向的蚂蚁;

  若存在,则将会感染[向左走] 和 [向右走] 的蚂蚁

  不存在,则感冒的蚂蚁独自离开,感染数为1

 

posted on 2019-03-30 10:38  WooKinson  阅读(137)  评论(0编辑  收藏  举报