历届试题 蚂蚁感冒

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


转载于:https://www.cnblogs.com/xunalove/p/6809159.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值