蚂蚁感冒"/>
蓝桥杯 PREV27 蚂蚁感冒
蓝桥杯 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] += 1else:continue# 蚂蚁碰面for i in range(len(ants)):if abs(ants[i]) == 0 or abs(ants[i]) == 100:continuefor j in range(i + 1, len(ants)):if abs(ants[i]) == abs(ants[j]):if i == 0:ants_cold[j] = Trueants[i] *= -1ants[j] *= -1# 蚂蚁是否全部爬离杆子count = 0for i in range(len(ants)):if abs(ants[i]) <= 0 or abs(ants[i]) >= 100:count += 1if count == len(ants):break# 统计感冒蚂蚁数量cold_number = 0for temp in ants_cold:if temp is True:cold_number += 1print(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;
}
更多推荐
蓝桥杯 PREV27 蚂蚁感冒
发布评论