PREV27__0">蓝桥杯 PREV27 蚂蚁感冒
问题描述
长100厘米的细长直杆子上有n只蚂蚁。它们的头有的朝左,有的朝右。每只蚂蚁都只能沿着杆子向前爬,速度是1厘米/秒。当两只蚂蚁碰面时,它们会同时掉头往相反的方向爬行。这些蚂蚁中,有1只蚂蚁感冒了。并且在和其它蚂蚁碰面时,会把感冒传染给碰到的蚂蚁。请你计算,当所有蚂蚁都爬离杆子时,有多少只蚂蚁患上了感冒。
输入格式
第一行输入一个整数n (1 < n < 50), 表示蚂蚁的总数。接着的一行是n个用空格分开的整数 Xi (-100 < Xi < 100), Xi的绝对值,表示蚂蚁离开杆子左边端点的距离。正值表示头朝右,负值表示头朝左,数据中不会出现0值,也不会出现两只蚂蚁占用同一位置。其中,第一个数据代表的蚂蚁感冒了。
输出格式
要求输出1个整数,表示最后感冒蚂蚁的数目。
样例输入
3 5 -2 8
样例输出
1
样例输入
5 -10 8 -20 12 25
样例输出
3
思路解析
- 解法一:暴力模拟
if __name__ == '__main__':
N = int(input()) # 蚂蚁数量
ants = [int(temp) for temp in input().strip().split()] # 存储各蚂蚁位置
ants_cold = [False for i in range(len(ants))] # 标识蚂蚁是否感冒
ants_cold[0] = True # 第一个蚂蚁感冒
while True:
# 蚂蚁行进
for i in range(len(ants)):
if 0 < abs(ants[i]) < 100:
ants[i] += 1
else:
continue
# 蚂蚁碰面
for i in range(len(ants)):
if abs(ants[i]) == 0 or abs(ants[i]) == 100:
continue
for j in range(i + 1, len(ants)):
if abs(ants[i]) == abs(ants[j]):
if i == 0:
ants_cold[j] = True
ants[i] *= -1
ants[j] *= -1
# 蚂蚁是否全部爬离杆子
count = 0
for i in range(len(ants)):
if abs(ants[i]) <= 0 or abs(ants[i]) >= 100:
count += 1
if count == len(ants):
break
# 统计感冒蚂蚁数量
cold_number = 0
for temp in ants_cold:
if temp is True:
cold_number += 1
print(cold_number)
-
解法二:
蚂蚁碰面掉头在不考虑蚂蚁个体的情况下实际上对问题没什么影响,总体的运动不变。
以感冒的蚂蚁为中心,蚂蚁们可以分为四类,一类在感冒蚂蚁左边往右走 l r lr lr;一类在感冒蚂蚁左边往左走 l l ll ll;一类在感冒蚂蚁右边往左走 r l rl rl;一类在感冒蚂蚁右边往右走 r r rr rr。
当感冒蚂蚁往左走时,会传染的有 l r lr lr,而 l r lr lr传染 r l rl rl,故感冒蚂蚁总数为 l r + r l + 1 lr+rl+1 lr+rl+1
当感冒蚂蚁往右走时,会传染的有 r l rl rl,而 r l rl rl传染 l r lr lr,故感冒蚂蚁总数为 r l + l r + 1 rl+lr+1 rl+lr+1
#include<iostream>
#include<cmath>
using namespace std;
int main() {
int n, cold, t, lr = 0, ll = 0, rr = 0, rl = 0, ans;
cin >> n >> cold;
for (int i = 0; i < n - 1; i++) {
cin >> t;
int pos_cold = abs(cold);
int pos = abs(t);
if (t > 0) {
if (pos < pos_cold) lr++;
else rr++;
}
else {
if (pos < pos_cold) ll++;
else rl++;
}
if (cold < 0) {
if (lr > 0) ans = lr + rl + 1;
}
else {
if (rl > 0) ans = rl + lr + 1;
}
cout << ans;
return 0;
}
}
上述的解法可以更简洁一些:
#include<iostream>
#include<cmath>
using namespace std;
int main() {
int n, cold, t, lr = 0, ll = 0, rr = 0, rl = 0, ans = 1;
cin >> n >> cold;
for (int i = 0; i < n - 1; i++) {
cin >> t;
int pos_cold = abs(cold);
int pos = abs(t);
if (t > 0) {
if (pos < pos_cold) lr++;
}
else {
if (pos > pos_cold) rl++;
}
}
if ((cold < 0 && lr > 0) || (cold > 0 && rl > 0)) {
ans = lr + rl + 1;
}
cout << ans;
return 0;
}