1. <?php  
  2. /*  
  3. *1:有一根27厘米的细木杆,在第3厘米、7厘米、 11厘米、17厘米、23厘米这五个位置上各有一只蚂蚁。  
  4. 木杆很细,不能同时通过一只蚂蚁。开始时,蚂蚁的头朝左还是朝右是任意的,它们只会朝前走或调头,  
  5. 但不会后退。当任意两只蚂蚁碰头时,两只蚂蚁会同时调头朝反方向走。假设蚂蚁们每秒钟可以走一厘米的距离。  
  6. 求所有蚂蚁都离开木杆的最小时间和最大时间。  
  7.  
  8. 输入木杆长度 L  
  9. 输入蚂蚁的个数 n  
  10. 输入每个蚂蚁在木杆上的位置 x1,x2……xn  
  11. 输出所有蚂蚁离开木杆的最小时间和最大时间  
  12.  
  13. 假设只有两只蚂蚁A,B  
  14. A在第3厘米a处,B在第7厘米b处  
  15.  
  16.  
  17. 若是A,B相向而行,如  
  18. 0   3   5  7                                                 27   
  19. +---+---+--+-------------------------------------------------+  
  20. x   a   o  b                                                 y  
  21.     A->  <-B  
  22.  
  23. 则A,B在第5厘米o处相遇后,同时调头朝反方向走  
  24. 则A走过的路程为ao+ox=7  
  25. 则B走过的路程为bo+oy=20  
  26. 则A+B=ao+ox+bo+oy=(ao+oy)+(bo+ox)=ay+bx  
  27. 发现  
  28. 在任意两只蚂蚁碰头时,两只蚂蚁会同时调头朝反方向走情况下走过的总路程=在任意两只蚂蚁碰头时,两只蚂蚁会交换位置不转向往前走情况下走过的总路程  
  29. 因此在计算最大最小时间时,可以忽略  
  30. 任意两只蚂蚁碰头时,两只蚂蚁会同时调头朝反方向走的条件  
  31. 时间最短时,A往离她最近的那头走,就是3,B往离她最近的那头走,就是7  
  32. 时间最多时,A往离她最远的那头走,就是27-3,B往离她最远的那头走,就是27-7  
  33.  
  34. 当蚂蚁为n时,时间最短时,所有蚂蚁都离她最近的那头走,取出路程最大的那只蚂蚁,一般是中间那只  
  35. 当蚂蚁为n时,时间最多时,所有蚂蚁都离她最远的那头走,取出路程最大的那只蚂蚁,一般是最靠近两头那只  
  36.  
  37. *系统环境:windows/linux  
  38. *编译环境:php4/php5  
  39. *输入参数:多个参数时空格分隔  
  40.                     参数1是一组数字  
  41.                     参数2是一个数字  
  42.                     参数3是一组数字,中间用逗号分割  
  43.                     例如格式:27 5 3,7,11,17,23  
  44. */ 
  45.  
  46.  
  47. $argv=$_SERVER['argv'];  
  48. $argv1=trim($argv[1]);  
  49. $argv2=trim($argv[2]);  
  50. $argv3=trim(trim($argv[3]),",");  
  51.  
  52. //检查参数1  
  53. if(!is_numeric($argv1))  
  54. {  
  55.     error_msg("参数1必须是整数");  
  56. }  
  57.  
  58. //检查参数2  
  59. if(!is_numeric($argv2))  
  60. {  
  61.     error_msg("参数2必须是整数");  
  62. }  
  63. //检查参数3  
  64. if(!preg_match_all("/^((\d+),?)+$/i"$argv2,$matches))  
  65. {  
  66.     error_msg("参数三必须是以逗号分割的数字串");  
  67. }  
  68.  
  69. //把参数3转为数组  
  70. $positions=split(",",$argv3);  
  71. $L=$argv1;  
  72. $n=$argv2;  
  73. if(count($positions)!= $n)  
  74. {  
  75.     error_msg("位置数必须等于蚂蚁数");  
  76. }  
  77.  
  78. $speed=1;  
  79. $min_time=array();  
  80. $max_time=array();  
  81. foreach($positions as $position)  
  82. {  
  83.     $min_time[]=min($position,$L-$position)/$speed;  
  84.     $max_time[]=max($position,$L-$position)/$speed;  
  85. }  
  86. //输出结果  
  87. echo "min time:".max($min_time)." s,max time:".max($max_time)."s\n";  
  88.  
  89. /*  
  90.     输入错误信息  
  91.     如果$isExit表示输入信息后退出  
  92. */ 
  93. function error_msg($msg,$isExit=true)  
  94. {  
  95.     if($isExit)  
  96.         die($msg."\n");  
  97.     else 
  98.         echo $msg."\n";  
  99. }  
  100. ?>