模拟了两个小时都没模拟出来,好复杂,百度了一下根本不用模拟,把两个相遇的蚂蚁视为穿行就可以了,汗,这样可以看成追击问题,所有右边向右和左边向左的蚂蚁都不会感冒,原先的代码仅考虑左边向右和右边向左就认为它会和其他蚂蚁碰面是错的,提交竟然通过了,汗!!!!

比如说6 5 4,  5 4都比6小,都向右走,但并不会碰面,所以还应该排除两种不存在穿行的情况

//只简单考虑了会发生穿行的情况
#include <iostream>
#include <cstdlib>
using namespace std;

int main()
{
    int a[110];
    int n, m, gan;
    int sum = 1;
    cin >> n; 
    
    cin >> m;   
    gan = abs(m);
    for(int i = 1 ; i < n; i++)
    {
            cin >> m;
            if(abs(m) < gan && m > 0)
               ++sum;
            if(abs(m) > gan  && m < 0)
               ++sum;
    }   
    cout << sum  << endl;
  return 0;
}    
   
错误代码

 

#include <iostream>
#include <cstdlib>
using namespace std;

int main()
{
    int a[110];
    int n, m, gan;
    int sum = 1;
    cin >> n;
    int sign = 1;
    for(int i = 0 ; i < n; i++)
    {
        cin >> a[i];
    }
    for(int i = 1; i < n; i++)
      if(abs(a[i]) > abs(a[0]) && a[i] * a[0] > 0 && !sign)
         sign = 0;
      else
         {
              sign = 1;
              break;
          }  
    for(int i = 1; i < n; i++)
      if(abs(a[i]) < abs(a[0]) && a[i] * a[0] > 0 && !sign)
         sign = 0;
      else
         {
              sign = 1;
              break;
         }
     if(sign)
     {
              for(int i = 1; i < n; i++)
                if(abs(a[i]) > abs(a[0])&& a[i] < 0)
                   ++sum ;
                 else
                    if(abs(a[i]) < abs(a[0])&& a[i] > 0)
                      ++sum ;
      }                
               
    cout << sum  << endl;
    //system("pause");
  return 0;
}    

       

 观察分析有时候比模拟更重要