1211-蚂蚁感冒
题目描述
关系
内容
问题分析
最初思路
如果这道题要模拟实现的话,是十分复杂的,恐怕得要用到线程,于是我不得不想这道题还是一道数学公式题目。
思路分析
关键在于把两个蚂蚁相撞,当成两只蚂蚁穿过。因为,本质上,每只蚂蚁除了位置不同,方向不同,都是一样的。
于是,调头的问题就被巧妙解决了。
假设感冒的蚂蚁为 a,并且向右走,那么 a 右边的向左走的蚂蚁都会被感染。
对于 a 左边的蚂蚁,有两种情况:
- 如果右边有蚂蚁向左走,那么左边所有向右走的蚂蚁都会被感染;
- 如果右边没有蚂蚁向左走,那么左边就不会有蚂蚁被感染;
如果蚂蚁 a 初始是向左走的,那么是同理的。
执行流程设计
总结
代码实现
#include <bits/stdc++.h>
using namespace std;
const int N = 55;
int n;
int x[N];
int main()
{
cin >> n;
for (int i = 0; i < n; i++) cin >> x[i];
int left = 0, right = 0; // 左边向右走的数量,和右边向左走的数量
for (int i = 1; i < n; i++) {
if (abs(x[i]) <= abs(x[0]) && x[i] > 0) left++;
else if (abs(x[i]) >= abs(x[0]) && x[i] < 0) right++;
}
if (x[0] > 0 && right == 0 || x[0] < 0 && left == 0) cout << 1 << endl;
else cout << left + right + 1 << endl;
return 0;
}