历届试题 蚂蚁感冒

来源:互联网 发布:淘宝韩国代购哪家好 编辑:程序博客网 时间:2024/04/28 00:30

  历届试题 蚂蚁感冒  
时间限制: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

解题思路:看了好久过了两组数据,百度看了一下其他的人的思路:

原来碰面的蚂蚁向反方向走等价于直接穿行过去,这样就比较好做了

首先对数据进行绝对值排序

感冒蚂蚁左爬的话:

如果它的左面有向右爬的蚂蚁,那么总感冒的蚂蚁=左面向右爬+右向左爬,

如果它的左面没有向右爬的蚂蚁,那么右面向左爬的不会感冒。。

同理,右爬道理一样。

还有注意的一点是蓝桥杯题目并没有说多组数据,没用多组测试数据我在官网提交0分。。。。

。。。。。。后面改了一下。。

我的代码:

// #include<iostream>#include<math.h>#include<memory.h>#include<algorithm>using namespace std;bool cmp(int x,int y){return abs(x)<abs(y);}int main(){int n;while(cin>>n){int a[100],i,temp,t;for(i=0;i<n;i++)cin>>a[i];temp=a[0];//感冒蚂蚁 sort(a,a+n,cmp);for(i=0;i<n;i++)//排序之后 感冒蚂蚁所在的weiz {if(a[i]==temp){t=i;break;}}if(temp>0)//右爬=右面向左爬的+右面向左爬的(前提是有右面向左爬的蚂蚁) {int s1=0,s2=0,sum=0;for(i=t+1;i<n;i++){if(a[i]<0) s1++;//右面向左爬的 }for(i=0;i<t;i++){if(a[i]>0)   s2++;//右面向左爬的 }if(s1>0)sum=s1+s2+1;elsesum=1;cout<<sum<<endl;}else//左爬=左面向右爬的+右爬向左爬的 {int s1=0,s2=0,sum=0;for(i=0;i<t;i++){if(a[i]>0)s1++;//左面向右爬的}for(i=t+1;i<n;i++){if(a[i]<0)  s2++;//右爬向左爬的}if(s1>0)sum=s1+s2+1;elsesum=1;cout<<sum<<endl;}}return 0;} 


1 0