蚂蚁感冒

来源:互联网 发布:做财务报表的软件 编辑:程序博客网 时间:2024/04/27 14:42

题目要求:




标题:蚂蚁感冒
    长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>, 不能通过工程设置而省略常用头文件。
提交时,注意选择所期望的编译器类型。


输入代码:


/* * 蚂蚁感冒 */import java.util.Scanner;public class Main {public static void main(String[] args) {      Scanner in=new Scanner(System.in);      int n=in.nextInt();      int []num=new int [n];      for(int i=0;i<n;i++)      {      num[i]=in.nextInt();      }            int left=0,right=0;      for(int j=1;j<n;j++)      {    if(num[j]>0&&Math.abs(num[j])<Math.abs(num[0]))//右边蚂蚁向左走的    {    left++;    }        if(num[j]<0&&Math.abs(num[j])>Math.abs(num[0]))//左边蚂蚁向右走的    {       right++;    }          }            if((num[0]>0&&left==0)||(num[0]<0&&right==0))//特殊情况      {      System.out.println("1");      }      else      {      int S=left+right+1;      System.out.println(S);      }}}


总结:

本题是看了别人的解题思路来做的,做完才发现这题也很水,想得有点复杂了。

思路是这样的:

     1.第一只蚂蚁不管方向朝哪它右边的蚂蚁只要向左走就可能碰撞感染(特殊情况除外),同样,第一只蚂蚁左边的蚂蚁只要朝右边走也可能被感染,这样就很容易得到这样的公式:

     感冒蚂蚁数 = 左边蚂蚁向右走的数量+右边蚂蚁向左走的数量+第一只蚂蚁本身=right+left+1;


     2.特殊情况是,当第一只蚂蚁向左走的时候如果第一只蚂蚁左边没有向右爬行的蚂蚁,那么不管第一只蚂蚁右边有多少向左爬行的,因为爬行的速度相同,所以右边的蚂蚁永远不可能被感染


     3.同样的,当第一只蚂蚁向右走的时候,如果第一只蚂蚁右边没有向左爬行的蚂蚁,那么同样第一只蚂蚁左边也永远不可能感染



0 0
原创粉丝点击