您的位置:首页 > 其它

历届试题 蚂蚁感冒

2017-04-06 17:17 239 查看
  历届试题 蚂蚁感冒  

时间限制: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;
else
sum=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;
else
sum=1;
cout<<sum<<endl;
}
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: