“花果山选举引发的一场血案”
“自花果山美猴王齐天大圣孙悟空被如来压在五指山下,花果山无人管理,受尽周边恶霸的欺负,长老们意识到花果山不能一日无主,于是决定选举一位临时大王,由于猴子猴孙水平都不相上下,推选谁都难以平众愤,长老们无计可施~~~一只聪明的猴子急中生智,提议:猴孙们围成一圈,按顺时针顺序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.
应用网页设计