蚂蚁感冒
Posted mabeytang
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了蚂蚁感冒相关的知识,希望对你有一定的参考价值。
问题描述
长100厘米的细长直杆子上有n只蚂蚁。它们的头有的朝左,有的朝右。
每只蚂蚁都只能沿着杆子向前爬,速度是1厘米/秒。
当两只蚂蚁碰面时,它们会同时掉头往相反的方向爬行。
这些蚂蚁中,有1只蚂蚁感冒了。并且在和其它蚂蚁碰面时,会把感冒传染给碰到的蚂蚁。
请你计算,当所有蚂蚁都爬离杆子时,有多少只蚂蚁患上了感冒。
每只蚂蚁都只能沿着杆子向前爬,速度是1厘米/秒。
当两只蚂蚁碰面时,它们会同时掉头往相反的方向爬行。
这些蚂蚁中,有1只蚂蚁感冒了。并且在和其它蚂蚁碰面时,会把感冒传染给碰到的蚂蚁。
请你计算,当所有蚂蚁都爬离杆子时,有多少只蚂蚁患上了感冒。
输入格式
第一行输入一个整数n (1 < n < 50), 表示蚂蚁的总数。
接着的一行是n个用空格分开的整数 Xi (-100 < Xi < 100), Xi的绝对值,表示蚂蚁离开杆子左边端点的距离。正值表示头朝右,负值表示头朝左,数据中不会出现0值,也不会出现两只蚂蚁占用同一位置。其中,第一个数据代表的蚂蚁感冒了。
接着的一行是n个用空格分开的整数 Xi (-100 < Xi < 100), Xi的绝对值,表示蚂蚁离开杆子左边端点的距离。正值表示头朝右,负值表示头朝左,数据中不会出现0值,也不会出现两只蚂蚁占用同一位置。其中,第一个数据代表的蚂蚁感冒了。
输出格式
要求输出1个整数,表示最后感冒蚂蚁的数目。
样例输入
3
5 -2 8
5 -2 8
样例输出
1
样例输入
5
-10 8 -20 12 25
-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 }
2019-02-05
18:55:04
以上是关于蚂蚁感冒的主要内容,如果未能解决你的问题,请参考以下文章