wu


私信TA

用户名:cncfvc

访问量:227220

签 名:

读研狗没有时间刷题了~~

等  级
排  名 3
经  验 37387
参赛次数 8
文章发表 265
年  龄 25
在职情况 学生
学  校 电子科技大学
专  业 通信工程

  自我简介:

写代码 真好玩 ~

这题做了很久 一开始以为只有第一只感冒的蚂蚁(病原体)会传染人 后来发现每只蚂蚁都会传染人
于是考虑病原体感染第一只蚂蚁后的再用被感染后的蚂蚁去感染别人  想用递归的方法去做 后来发现太复杂了 
不太现实 ,在我仔细研究题目和画图分析之后(这个精神确实需要 不要动不动就去看别人的答案)我发现如果病原体是
向左走的话,那么它的左边的所有蚂蚁都向右走的都会被感染,同理,如果病原体向右走,那么它右边的所有向左走的蚂蚁
都会被感染,因为向左走和向右走的蚂蚁可以看作是调换了位置(相当于穿过了对方的身体),因为考虑的是被感染
蚂蚁的数量,而不是具体的哪一只蚂蚁。这样就可以把感冒蚂蚁的总数看作为==左边向右走的蚂蚁+右边向左走的蚂蚁+
被感染的蚂蚁本身(1),当然也有特殊情况就是,病原体的右边或者是左变全是跟它同一个方向的蚂蚁,那么感冒的蚂蚁
数量就是1,废话不多说,上代码:
#include<iostream>
#include<algorithm> 
#include<cmath>
using namespace std;
void f(int a[],int flag,int n)
{
	int sum1=0;
	int sum2=0;
			for(int j=flag-1;j>=0;j--)//从左往右走的蚂蚁数量
			{
				if(a[j]>0) 
				{
					sum1++;
				}
			}
			for(int j=flag+1;j<=n;j++)//从右往左走的蚂蚁数量
			{
				if (a[j]<0)
				{
					sum2++;
				}
			} 
			if(a[flag]<0&&sum1==0||a[flag]>0&&sum2==0) cout<<"1"<<endl;//特殊情况
			else
	        cout<<sum1+sum2+1<<endl;	
}
int a[55];
int cmp(int a,int b)
{
	return abs(a)<abs(b); 
}
int main()
{
	//freopen("data.in.txt","r",stdin);
	int n;
	cin>>n;
	for(int i=0;i<n;i++)
	{
		cin>>a[i];

	}
	int x=a[0];
	sort(a,a+n,cmp);
	int flag;
    for(int i=0;i<n;i++)
    {
    	if(a[i]==x)
		{
		     flag=i;
			 break;
		} 
	}
    f(a,flag,n);
	return 0;
	
 }


 

0.0分

6 人评分

  评论区

你好!
我给一个例子:
13,-8,12,20,-25,30
其中13是病原体
我把他们按顺序排列:
-8,12,13,20,-25,30
敢问,-25会被感染吗?
2018-01-30 12:02:14
  • «
  • 1
  • »