思路1:
一个很重要的观点:当一只感冒的蚂蚁与另一只蚂蚁接触后,两只蚂蚁反向行走
(1)正常理解,感冒的蚂蚁和被传染的蚂蚁反向行走;
(2)同结果代替思维:蚂蚁们相互“穿”行,“继续按原方向行走”–>跟感冒蚂蚁反方向行走的蚂蚁均被感染;
思路2:
(1)如果感冒蚂蚁向右走:
——它右边(绝对值比感冒蚂蚁大的)向左走(负)的蚂蚁均会被感染
——它左边向右走的蚂蚁也会被感染(因为会被向左走的被感染的蚂蚁感染
——感冒蚂蚁数 = 右边向左走的蚂蚁数 + 左边向右走的蚂蚁数
(2)如果感冒蚂蚁向左走
——它左边(绝对值比感冒蚂蚁小的)向右走(正)的蚂蚁均会被感染
——它右边向左走的蚂蚁也会被感染(因为会被向右走的被感染的蚂蚁感染
——感冒蚂蚁数 = 左边向右走的蚂蚁数 + 右边向左走的蚂蚁数
代码
#include <cstdlib>
#include <iostream>
using namespace std;
const int N =55;
int n,x[N];
int main()
{
//掉头可以直接等价位原路继续前进
cin>>n;
for(int i=0;i<n;i++) cin>>x[i];
int left_R=0 ,right_L=0; //分别表示左边向右走和右边向左走的蚂蚁数量
for(int i=1;i<n;i++)
//PS:abs 是一个函数,用于计算整数的绝对值。它的原型定义在 <cstdlib> 头文件中
if(abs(x[i])<abs(x[0])&&x[i]>0) left_R++; //在左边向右走
else if(abs(x[i])>abs(x[0])&&x[i]<0) right_L++; //在右边向左走
//如果感冒蚂蚁向右(左),右(左)边没有一只向左(右)走的蚂蚁,必然感染不了
if(x[0]>0&&right_L==0||x[0]<0&&left_R==0) cout<<'1'<<endl;
//否则,感冒的蚂蚁会把和他对着走的蚂蚁感染,而这些被感染的蚂蚁又会将向着他们的蚂蚁感染了
else cout<<left_R+right_L+1<<endl;
return 0;
}