蚂蚁感冒

来源:互联网 发布:openframeworks知乎 编辑:程序博客网 时间:2024/04/27 17:06
长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  
资源约定: 
峰值内存消耗 < 256M CPU消耗  < 1000ms   

请严格按要求输出,不要画蛇添足地打印类似:“请您输入...” 的多余内容。

所有代码放在同一个源文件中,调试通过后,拷贝提交该源码。  
注意: main函数需要返回0 
注意: 只使用ANSI C/ANSI C++ 标准,不要调用依赖于编译环境或操作系统的特殊函数。 注意: 所有依赖的函数必须明确地在源文件中 #include <xxx>, 不能通过工程设置而省略常用头文件。  
提交时,注意选择所期望的编译器类型。

#include <cstdio>

 #include <cmath> 

using namespace std; 

struct T

 int drec, flag; 
};

 T arr[100];

 int size = 0;

int main() 

{  int n, t; 
 scanf("%d", &n); 

 for(int i = 0; i < n; i++) 

 {   scanf("%d", &t);  

 if(i == 0)    
arr[0].flag = 1; 

  arr[size++].drec = t; 
 } 
 int sum = 1, nowHave = n; 

 while(nowHave > 0) 

 {   for(int i = 0; i < size; i++) 

  {  
 
 
if(arr[i].drec > 0)

arr[i].drec += 1; 
   else     
arr[i].drec += 1; 
   if(abs(arr[i].drec) < 0 || abs(arr[i].drec) > 100)     
nowHave--; 
  } 
  for(int i = 0; i < size; i++)   

 for(int j = i + 1; j < size; j++)  

  {     if(abs(arr[j].drec) == abs(arr[i].drec)) 

    {      if(arr[i].flag == 1 || arr[j].flag == 1)   

   {       if(arr[i].flag + arr[j].flag == 1)        
sum++; 
      arr[i].flag = arr[j].flag = 1; 
     } 
     arr[j].drec = 0 - arr[j].drec;     

 arr[i].drec = 0 - arr[i].drec;     } 
   

 
}

 printf("%d", sum);  

return 0; 
}

0 0
原创粉丝点击