2099: 蚂蚁感冒
Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 72 Solved: 32
[ Submit][ Status][ Web Board]
Description
长100厘米的细长直杆子上有n只蚂蚁。它们的头有的朝左,有的朝右。
每只蚂蚁都只能沿着杆子向前爬,速度是1厘米/秒。
当两只蚂蚁碰面时,它们会同时掉头往相反的方向爬行。
这些蚂蚁中,有1只蚂蚁感冒了。并且在和其它蚂蚁碰面时,会把感冒传染给碰到的蚂蚁。
请你计算,当所有蚂蚁都爬离杆子时,有多少只蚂蚁患上了感冒。
Input
第一行输入一个整数n (1 < n < 50), 表示蚂蚁的总数。
接着的一行是n个用空格分开的整数 Xi (-100 < Xi < 100), Xi的绝对值,表示蚂蚁离开杆子左边端点的距离。正值表示头朝右,负值表示头朝左,数据中不会出现0值,也不会出现两只蚂蚁占用同一位置。其中,第一个数 据代表的蚂蚁感冒了。
Output
要求输出1个整数,表示最后感冒蚂蚁的数目。
Sample Input
3
5 -2 8
Sample Output
1
HINT
Source
【解析】
感觉这题有点意思,虽然看着模拟好像超难的样子,但是梳理一下问题就解决了,中等偏下的难度吧。
可以将这根杆子分成左右两部分,以最开始的那只病蚂蚁为中心。
病蚂蚁如果向左边走,只要它的左边有向右走的蚂蚁,有几只就会被传染几只(也许被感染的不是同一只,但数量上一定是相等的,不信自己模拟看看),这时,只要它的左边的直杆上有一只向右走的蚂蚁,那么它右边的直杆上向左走的蚂蚁,走到最后肯定也得病。但有个特殊情况,如果左边一只都没有向右走的蚂蚁,那最后只有原来的那只病蚂蚁。
如果病蚂蚁向右走,也是同理。
#include <bits/stdc++.h>
using namespace std;
bool cmp(int a, int b)
{
return abs(a) < abs(b) ? 1 : 0;//用了一个abs绝对值,因为正负只表示头朝向,与位置无关
}
int main()
{
int n, a[55];
while (~scanf("%d", &n))
{
scanf("%d", &a[0]);
int fever = a[0]; //记录病蚂蚁位置
for (int i = 1; i < n; i++)scanf("%d", &a[i]);
sort(a, a + n, cmp); //乱序的但是顺序对本题很重要,自然要先排序
int left = 0, right = 0, ans = 0, pos;
for (int i = 0; i < n; i++)//重新回来找那只病蚂蚁
if (a[i] == fever)pos = i;
for (int i = pos + 1; i < n; i++)//病蚂蚁的右边向左走蚂蚁的数量
if (a[i] < 0)right++;
for (int i = 0; i < pos; i++)//病蚂蚁的左边向右走蚂蚁的数量
if (a[i] > 0)left++;
if ((fever > 0 && right == 0) || (fever < 0 && left == 0))//有一种特殊情况就是
ans = 1; //有一边全是可以直接走通木杆的,那就不会传染别的蚂蚁了
else
ans = left + right + 1; //一般情况下,两边都会被感染,加起来就好了
printf("%d\n", ans);
}
return 0;
}