您的位置:首页 > 其它

sdnu 1206 蚂蚁感冒

2015-06-15 22:45 267 查看
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

因为不需要记录蚂蚁的 ID。

所以该题可以将蚂蚁的调头看成“对穿而过”。

#include<iostream>
#include<algorithm>
using namespace std;
int ant[50 + 5];
bool cmp(int x, int y)   //按距离排序
{
x = x < 0 ? -x : x;
y = y < 0 ? -y : y;
return x < y;
}
int main()
{
int n;
cin >> n;
for (int i = 0; i < n; i++)
cin>>ant[i];
int gm = ant[0],pos;   //记录下第一只感冒蚂蚁的位置以及方向
sort(ant, ant + n, cmp);
for (int i = 0; i < n; i++)//找到排序后M的位置   (M代指最初感冒的蚂蚁)
{
if (gm == ant[i])
{
pos = i;
break;
}
}
int sum = 1;
if (ant[pos] < 0)    //若蚂蚁头朝左
{
for (int i = 0; i < pos; i++)//则找  ①头朝右   ②在M左端的    所有蚂蚁
{
if (ant[i]>0)
sum++;
}
if (sum != 0)      //必须判断M左端是否有头朝右的蚂蚁,否则,下面不成立   即不会有向右走的感冒蚂蚁
{
for (int i = pos + 1; i < n; i++)
{
if (ant[i] < 0)
sum++;
}
}
}
else   //若蚂蚁头朝右,分析同上
{
for (int i = pos + 1; i < n; i++)
{
if (ant[i] < 0)
sum++;
}
if (sum != 0)
{
for (int i = 0; i < pos; i++)
{
if (ant[i]>0)
sum++;
}
}
}
cout << sum << endl;
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: