头像

Cyan

四川成都

深度强化学习炼丹师

2014年第五届蓝桥杯省赛-H. 蚂蚁感冒

2014年第五届蓝桥杯省赛-H. 蚂蚁感冒

2021-12-13 · 40次阅读 · 原创 · 数据结构与算法

原题链接

题面

长 100 厘米的细长直杆子上有 n 只蚂蚁。它们的头有的朝左,有的朝右。

每只蚂蚁都只能沿着杆子向前爬,速度是 1 厘米/秒。

当两只蚂蚁碰面时,它们会同时掉头往相反的方向爬行。

这些蚂蚁中,有 1 只蚂蚁感冒了。并且在和其它蚂蚁碰面时,会把感冒传染给碰到的蚂蚁。

请你计算,当所有蚂蚁都爬离杆子时,有多少只蚂蚁患上了感冒。

输入描述

第一行输入一个整数 n (1<n<50), 表示蚂蚁的总数。

接着的一行是 n 个用空格分开的整数 Xi (100<Xi<100)X_i\ (-100 < X_i < 100), Xi 的绝对值,表示蚂蚁离开杆子左边端点的距离。正值表示头朝右,负值表示头朝左,数据中不会出现 0 值,也不会出现两只蚂蚁占用同一位置。其中,第一个数据代表的蚂蚁感冒了。

输出描述

要求输出 1 个整数,表示最后感冒蚂蚁的数目。

输入样例

3
5 -2 8

输出样例

1

题解

思维题

首先,有一个重要的点,题目说两只蚂蚁相遇后会调头,且若一只蚂蚁被感染,则另一只蚂蚁也被感染,则这里掉头等价于没有掉头,而是沿着原方向前进。

统计在第一只感冒的蚂蚁的左边且向右边走的蚂蚁数量,以及在第一只感冒的蚂蚁的右边向左走的蚂蚁数量,若两边的数量都大于0,则两边数量相加即为结果,否则只有第一只蚂蚁感冒,具体见代码。

代码

#include<iostream> using namespace std; const int N = 52; int n, st_i; int main() { cin >> n; int x, left = 0, right = 0; cin >> x; st_i = x > 0 ? x : -x; //感冒蚂蚁的坐标 x > 0 ? left++ : right++; for (int i = 2; i <= n; i++) { cin >> x; if (abs(x) < st_i && x > 0) left++; if (abs(x) > st_i && x < 0) right++; } if (left && right) cout << left + right << endl; else puts("1"); return 0; }

标题: 2014年第五届蓝桥杯省赛-H. 蚂蚁感冒
链接: https://www.fightingok.cn/detail/169
更新: 2022-09-18 22:44:56
版权: 本文采用 CC BY-NC-SA 3.0 CN 协议进行许可