蚂蚁感冒
蚂蚁感冒
(https://www.luogu.com.cn/problem/P8611)
日常解读一下题目,首先,已知已经有一只蚂蚁感冒了,当这只蚂蚁与其他蚂蚁碰头的时候,感冒会传染,问当所有蚂蚁离开这个木棍后,共有几只蚂蚁感冒了
题目还说,两只蚂蚁相碰时,会掉头 --> 这个可能会有点误区,就一直在想怎么去写掉头,我们简化一下,两只蚂蚁(有一只是感染的)碰头,那么两只最终都会称为感染者,那么掉不掉头有什么关系呢,一直向前走就是了。
解读到上边,那么问题就成了以最开始感染的蚂蚁为起点,向左/向右遍历一遍,看看有没有方向相反的蚂蚁,如果有那么感染者+1 且此时还要向右/向左遍历一遍,检查最开始感染的蚂蚁另一边有没有方向相反的蚂蚁,有就+1.反之就不用再遍历了,因为蚂蚁的速度是一样的,不存在追及问题
ACODE
#include <bits/stdc++.h>
#define ll long long
#define endl '\n'
using namespace std;
int main() {
ios::sync_with_stdio(0);
cin.tie(0),cout.tie(0);
int n; cin >> n;
vector<int> ans(101);int begin;
for (int i = 1; i <= n; i++) {
int a; cin >> a;
if(i == 1){
ans[abs(a)] = -1;
begin = a;
}
else{
if(a < 0)ans[abs(a)] = -2;
else ans[a] = 1;
}
}
int count = 1;
if(begin > 0){
for (int i = begin+1; i <= 100; i++) {
if(ans[i] < 0)count ++;
}
if(count != 1){
for (int i = 1; i <= begin-1; i++) {
if(ans[i] > 0)count++;
}
}
}else{
for (int i = 1; i < abs(begin); i++) {
if(ans[i] > 0)count++;
}
if(count != 1) {
for (int i = abs(begin)+1; i <= 100; i++) {
if (ans[i] < 0)count++;
}
}
}
cout << count << endl;
return 0;
}