1. /*  
  2. // java test  27 5 3,7,11,17,23  
  3.  
  4. *1:有一根27厘米的细木杆,在第3厘米、7厘米、 11厘米、17厘米、23厘米这五个位置上各有一只蚂蚁。  
  5. 木杆很细,不能同时通过一只蚂蚁。开始时,蚂蚁的头朝左还是朝右是任意的,它们只会朝前走或调头,  
  6. 但不会后退。当任意两只蚂蚁碰头时,两只蚂蚁会同时调头朝反方向走。假设蚂蚁们每秒钟可以走一厘米的距离。  
  7. 求所有蚂蚁都离开木杆的最小时间和最大时间。  
  8.  
  9. ps:请各位隐藏答案,语言不限  
  10.  
  11. 输入木杆长度 L  
  12. 输入蚂蚁的个数 n  
  13. 输入每个蚂蚁在木杆上的位置 x1,x2……xn  
  14. 输出所有蚂蚁离开木杆的最小时间和最大时间  
  15.  
  16. 假设只有两只蚂蚁A,B  
  17. A在第3厘米a处,B在第7厘米b处  
  18.  
  19.  
  20. 若是A,B相向而行,如  
  21. 0   3   5  7                                                 27   
  22. +---+---+--+-------------------------------------------------+  
  23. x   a   o  b                                                 y  
  24.     A->  <-B  
  25.  
  26. 则A,B在第5厘米o处相遇后,同时调头朝反方向走  
  27. 则A走过的路程为ao+ox=7  
  28. 则B走过的路程为bo+oy=20  
  29. 则A+B=ao+ox+bo+oy=(ao+oy)+(bo+ox)=ay+bx  
  30. 发现  
  31. 在任意两只蚂蚁碰头时,两只蚂蚁会同时调头朝反方向走情况下走过的总路程=在任意两只蚂蚁碰头时,两只蚂蚁会交换位置不转向往前走情况下走过的总路程  
  32. 因此在计算最大最小时间时,可以忽略  
  33. 任意两只蚂蚁碰头时,两只蚂蚁会同时调头朝反方向走的条件  
  34. 时间最短时,A往离她最近的那头走,就是3,B往离她最近的那头走,就是7  
  35. 时间最多时,A往离她最远的那头走,就是27-3,B往离她最远的那头走,就是27-7  
  36.  
  37. 当蚂蚁为n时,时间最短时,所有蚂蚁都离她最近的那头走,取出路程最大的那只蚂蚁,一般是中间那只  
  38. 当蚂蚁为n时,时间最多时,所有蚂蚁都离她最远的那头走,取出路程最大的那只蚂蚁,一般是最靠近两头那只  
  39.  
  40. *系统环境:windows/linux  
  41. *编译环境:java  
  42. *输入参数:多个参数时空格分隔  
  43.                     参数1是一组数字  
  44.                     参数2是一个数字  
  45.                     参数3是一组数字,中间用逗号分割  
  46.                     例如格式:27 5 3,7,11,17,23  
  47. */ 
  48.  
  49. import java.util.ArrayList;  
  50.  
  51. public class test {  
  52.     public static void main(String argv[]) {  
  53.         if(argv.length < 3){  
  54.             help("must input 3 params");  
  55.             return;  
  56.         }  
  57.         int L=0;  
  58.         try{  
  59.             L=Integer.parseInt(argv[0]);  
  60.         }catch(Exception e){  
  61.             help("param 1 must be int");  
  62.             return;  
  63.         }  
  64.         int n=0;  
  65.         try{  
  66.             n=Integer.parseInt(argv[1]);  
  67.         }catch(Exception e){  
  68.             help("param 2 must be int");  
  69.             return;  
  70.         }  
  71.         ArrayList<Integer> positions=new ArrayList<Integer>();  
  72.         String[] s=argv[2].split(",");  
  73.         if(s.length!=n){  
  74.             help("position number must equal ants number");  
  75.             return;  
  76.         }  
  77.         try{  
  78.             for(int i=0;i<n;i++){  
  79.                 positions.add(Integer.parseInt(s[i]));  
  80.             }  
  81.         }catch(Exception e){  
  82.             help("param 3 must be like 3,7,11,17,23");  
  83.             return;  
  84.         }  
  85.         int minTime=0;  
  86.         int maxTime=0;  
  87.         int speed=1;  
  88.         for(int i=0;i<positions.size();i++){  
  89.             int position=positions.get(i);  
  90.             minTime=Math.max(minTime, Math.min(position,L-position)/speed);  
  91.             maxTime=Math.max(maxTime, Math.max(position,L-position)/speed);  
  92.         }  
  93.         System.out.println("min time:"+minTime+"s,max time:"+maxTime+"s");  
  94.     }  
  95.     public static void help(String msg){  
  96.         System.out.println(msg);  
  97.         System.out.println("param 1: L");  
  98.         System.out.println("param 2: ants number n");  
  99.         System.out.println("parms 3: ant positions :x1,x2...xn break with ,");  
  100.     }  
  101. }