PHP队列--选举引发的一场血案

“花果山选举引发的一场血案”

“自花果山美猴王齐天大圣孙悟空被如来压在五指山下,花果山无人管理,受尽周边恶霸的欺负,长老们意识到花果山不能一日无主,于是决定选举一位临时大王,由于猴子猴孙水平都不相上下,推选谁都难以平众愤,长老们无计可施~~~一只聪明的猴子急中生智,提议:猴孙们围成一圈,按顺时针顺序1~n编号,由德高望重的猴博士随机选出一个数字m,从编号1的猴子开始从1报数,报数为m的猴子退出选举,再由下一只猴子从1报数,下一只报数为1的猴子也退出选举……,以此类推,直到只剩下一只猴子结束报数,这只猴子就是临时大王。虽然这个提议得到长老们一致认同,但是花果山有成千上万的猴孙们,等选举出新大王时都已猴年马月了,此时猴博士拿出神器iphon8,google了一下,找到一款类似的决策应用软件,终于轻松地解决了这个问题~~”(娱乐结束!)

如果你是这款应用的开发者,你该怎么实现它?

1. 算法思想:利用队列实现(想必还有更好的解决方案,不放说出来大家学习学习!),这里采用顺序存储结构,即定义一个长度为n的数组data[n],数组第一个元素为队头front,最后一个元素为队尾rear,反复操作入队出队。

1)先将编号1~n入队,若队列不止一个元素,反复操作2);

2)出队一个元素,若为第m次出队,将刚出队元素记录到退出记录数组;否则,将刚出队的元素再次入队。

2. 对应算法如下:

<?php
function outputKing($n,$m){
     $data = array();
     $outOrder = array();   //记录出队顺序数组
     $num = 0;
     for ($i=0;$i<$n;$i++){   //构建初始队列  
         $data[$i] = $i; 
     }
     while (count($data)>1){ //队列元素大于1
         $front = array_shift($data); //出队一个元素
         $num++;
         if ($num == $m){
             array_push($outOrder,$front); //出队一个元素,并将此元素记录到退出顺序数组,即报数m的猴子退出选举并记录退出顺序
             $m = 0;
         }else{
            array_push($data,$front); //再次入队一个元素
         }
        
     }
     return current($data); //返回最终余下的元素,即选举出来的大王编号 
}
?>

3.
应用网页设计

点赞