题目
思路
"两蚂蚁碰面会掉头,若其中一只蚂蚁感冒了,会把感冒传染给碰到的蚂蚁",这句话看作是"两蚂蚁碰面会互相穿过,只是把感冒的状态传给了另一只蚂蚁",因为哪只蚂蚁感冒了并不是题目的重点,重点是有多少蚂蚁感冒了。因此本题可以理解为:感冒的蚂蚁一直往一个方向走,求共感染了几只蚂蚁?
通过观察可以发现,若以第一只感冒蚂蚁的位置来分左右界,
- 若感冒蚂蚁向右走,由于蚂蚁速度大小相同:
在右界,向右边走的蚂蚁必定不会被感染,向左边走的蚂蚁必定被感染。
在左界,若右界有向左走的蚂蚁,那么左界向右边走的必定被感染;否则不会被感染。向左边走的不会被感染。
- 若感冒蚂蚁向左走,由于蚂蚁速度大小相同:
在左界,向左边走的蚂蚁必定不会被感染,向右边走的蚂蚁必定被感染。
在右界,若左界有向右走的蚂蚁,那么右界向左边走的必定被感染;否则不会被感染。向右边走的不会被感染。
代码
cpp
#include<bits/stdc++.h>
using namespace std;
int main()
{
int n, x, x1;
int rtl = 0, ltr = 0;//右界向左走的蚂蚁;左界向右走的蚂蚁
cin >> n;
cin >> x;
if (x > 0)
{
for (int i = 2; i <= n; i ++)
{
cin >> x1;
if (abs(x1) > abs(x) && x1 < 0) rtl ++;
if (abs(x1) < abs(x) && x1 > 0) ltr ++;
}
//"1"表示第一个感冒的蚂蚁
int res = 1 + rtl;
if (rtl) res += ltr;
cout << res;
}
else
{
for (int i = 2; i <= n; i ++)
{
cin >> x1;
if (abs(x1) < abs(x) && x1 > 0) ltr ++;
if (abs(x1) > abs(x) && x1 < 0) rtl ++;
}
int res = 1 + ltr;
if (ltr) res += rtl;
cout << res;
}
return 0;
}
简化版代码
通过上面的代码可以发现,当第一只感冒的蚂蚁向右走时,只有rtl大于0,ltr才能加入到res中;若rtl为0,那么把rtl加入到res中没有意义。当第一只感冒的蚂蚁向左走时,只有ltr大于0,rtl才能加入到res中;若ltr为0,那么把ltr加入到res中没有意义。
cpp
#include<bits/stdc++.h>
using namespace std;
int main()
{
int n, x, x1;
cin >> n;
cin >> x;
//以第一只感冒的蚂蚁为界,l:向左边走的蚂蚁的数量;r:向右边走的蚂蚁的数量
int l = 0, r = 0;
for (int i = 2; i <= n; i ++)
{
cin >> x1;
if (abs(x1) < abs(x) && x1 > 0) r ++;
if (abs(x1) > abs(x) && x1 < 0) l ++;
}
int res = 1;
if ((x < 0 && r) || (x > 0 && l)) res += (r + l);
cout << res;
}