题面
长 100 厘米的细长直杆子上有 n 只蚂蚁。它们的头有的朝左,有的朝右。
每只蚂蚁都只能沿着杆子向前爬,速度是 1 厘米/秒。
当两只蚂蚁碰面时,它们会同时掉头往相反的方向爬行。
这些蚂蚁中,有 1 只蚂蚁感冒了。并且在和其它蚂蚁碰面时,会把感冒传染给碰到的蚂蚁。
请你计算,当所有蚂蚁都爬离杆子时,有多少只蚂蚁患上了感冒。
输入描述
第一行输入一个整数 n (1<n<50), 表示蚂蚁的总数。
接着的一行是 n 个用空格分开的整数 , 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 协议进行许可 |