蓝桥杯 PREV27 蚂蚁感冒

编程入门 行业动态 更新时间:2024-10-24 15:26:57

蓝桥杯 PREV27 <a href=https://www.elefans.com/category/jswz/34/1765618.html style=蚂蚁感冒"/>

蓝桥杯 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 蚂蚁感冒

本文发布于:2023-07-28 15:43:56,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1239196.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:蚂蚁   蓝桥杯

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!