时间限制:1.0s 内存限制:256.0MB
问题描述
长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
分析:
此题是poj 1852的变形, 当蚂蚁相遇时,若某只蚂蚁患有感冒,就传染给对方,并且两只蚂蚁都反向爬。 在这里分析得到可以无视蚂蚁的区别。
Code:
#include <bits/stdc++.h>
using namespace std;
#define mem(a,n) memset(a,n,sizeof(a))
#define memc(a,b) memcpy(a,b,sizeof(b))
#define rep(i,a,n) for(int i=a;i<n;i++) ///[a,n)
#define dec(i,n,a) for(int i=n;i>=a;i--)///[n,a]
#define pb push_back
#define fi first
#define se second
#define IO ios::sync_with_stdio(false)
#define fre freopen("in.txt","r",stdin)
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
typedef long long ll;
typedef unsigned long long ull;
const double PI=acos(-1.0);
const double E=2.718281828459045;
const double eps=1e-3;
const int INF=0x3f3f3f3f;
const int MOD=1e9+7;
const int N=50+5;
const ll maxn=1e6+5;
const int dir[4][2]= {-1,0,1,0,0,-1,0,1};
int n,a[N];
int main()
{
//fre;
while(~scanf("%d",&n))
{
mem(a,0);
rep(i,1,n+1) scanf("%d",&a[i]);
if(a[1]<0)
{
int minx=100,cnt=0;
rep(i,2,n+1)
{
if(-a[1]>a[i]&&a[i]>0)
{
cnt++;
if(a[i]<minx)
minx=a[i];
}
}
rep(i,2,n+1)
{
if(minx==100)
break;
if(-a[i]>minx)
cnt++;
}
printf("%d\n",cnt+1);
}
else ///a[1]>0
{
int maxx=0,cnt=0;
rep(i,2,n+1)
{
if(a[1]<-a[i])
{
cnt++;
if(-a[i]>maxx)
maxx=-a[i];
}
}
rep(i,2,n+1)
{
if(maxx==0)
break;
if(a[i]<maxx&&a[i]>0)
{
cnt++;
}
}
printf("%d\n",cnt+1);
}
}
return 0;
}