算法1
(y总模拟)
不管初始的蚂蚁的方向如何,只需要统计在它右边且向左走的总数left和在它左边且向右走的总数right即可。
但如果这只蚂蚁
- 起初向左走(<0)但是左边没有向右走的right==0,它不会感染任何蚂蚁
- 起初向右走(<0)但是左边没有向右走的left==0,它不会感染任何蚂蚁
其他的情况感染蚂蚁总数为left+right+1.
C++ 代码
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
const int N = 55;
int n;
int x[N];
int main()
{
cin >> n;
for (int i = 0; i < n; i ++ ) cin >> x[i];
int left = 0, right = 0; // 分别表示左边向右走的蚂蚁数量,和右边向左走的蚂蚁数量
for (int i = 1; i < n; i ++ )
if (abs(x[i]) < abs(x[0]) && x[i] > 0) left ++ ;
else if (abs(x[i]) > abs(x[0]) && x[i] < 0) right ++ ;
if (x[0] > 0 && right == 0 || x[0] < 0 && left == 0) cout << 1 << endl;
else cout << left + right + 1 << endl;
return 0;
}
算法2
(暴力模拟)
C++ 代码
#include<bits/stdc++.h>
using namespace std;
const int N = 55;
struct node{
int idx;
bool operator<(const node&p)
{
return abs(idx)<abs(p.idx);
}
}ant[110];
int n,a0,a0id,ans;
int main()
{
cin>>n;
for(int i=0;i<n;i++)
{
cin>>ant[i].idx;
if(i==0) a0=ant[i].idx;
}
sort(ant,ant+n);
if(a0<0)
{
for(int i=0;i<n;i++)
{
if(ant[i].idx==a0)
{
a0id=i;
break;
}
}
for(int i=0;i<a0id;i++)
{
if(ant[i].idx>0) ans++;
}
if(!ans)
{
cout<<1<<endl;
return 0;
}
for(int i=a0id;i<n;i++)
{
if(ant[i].idx<0) ans++;
}
cout<<ans<<endl;
}
else{
for(int i=0;i<n;i++)
{
if(ant[i].idx==a0)
{
a0id=i;
break;
}
}
for(int i=a0id+1;i<n;i++)
{
if(ant[i].idx<0) ans++;
}
if(!ans)
{
cout<<1<<endl;
return 0;
}
for(int i=0;i<=a0id;i++)
{
if(ant[i].idx>0) ans++;
}
cout<<ans<<endl;
}
return 0;
}