<?php
#寻找一个满足给定空数和题数要求的随机方案,事先需统计出每题空格数情况队列$m_blk,以及这些题分别有多少个$m_que。
#以下算法将找到一个随机方案,若未找到将返回假值,如果不限题数,请将题数置为不大于0的数。 $m_v = array(); //目标随机方案 $m_blk = array(); //空格数情况,从小到大排列
$m_que = array(); //空格题数 $m_cnt = array(); //取出的某空格数的题数 //$test_level = 0; //测试变量 function CheckQue($i) //检查题数是否够取,$i为已取的相应空格数题的数量
{
global $m_que;
global $m_cnt;
echo " CheckQue ".$i."_".$m_cnt[$i]."<".$m_que[$i]."; ";
return ($m_cnt[$i] <= $m_que[$i]); //取值正常,已经不可能取到这么多题时,返回错误
}
function CheckLimit($num, $blk) //检查剩下的空数与题数是否有可能的解
{
echo " Limit num".$num.", blk".$blk."; ";
global $m_blk;
return $num>=0?($num*$m_blk[count($m_blk)-1]>=$blk && $num*$m_blk[0]<=$blk):true;
}
function CheckMax($blk) //检查一次题库中空数是否存在选出总空数的可能
{
global $m_blk;
global $m_que;
$t = 0;
for($i=0; $i<count($m_que); $t+=$m_que[$i]*$m_blk[$i],++$i);
echo " t ".$t." blk ".$blk."; ";
return $t>=$blk;
} function SituationVR($nNum , $nBlk) //找到一个方案并返回。nNum目标题数,nBlk目标空数,v每题空格数,且从小到大排列
{
//global $test_level;//测试
//$test_level += 1;
//echo "<br>".$test_level.">"; global $m_v;
global $m_blk;
global $m_cnt; $v = array_keys($m_blk); //拷贝一个原空数队列的序列出来作为新数列去取序号,这样使得$m_cnt可准确计数 for ( $i=0; count($v)>0; $m_cnt[$i] -= 1)
{
echo "<br>"."#";
$ii = mt_rand(0,count($v)-1); //取一题空数为$i,并将记录删除已取过的序号,取出来的是序号的序号
$i = $v[$ii]; //空格队列索引
$b = $m_blk[$i]; //空格数
$m_cnt[$i] += 1; //计数
unset( $v[$ii]);
$v = array_values($v);
echo " ii".$ii." i".$i." b".$b."; "; if (!CheckQue($i)) //检查取题数是否正常范围,超出重取,取不出返回假
{
continue;
} array_push($m_v, $b); //进栈
$t = array_sum($m_v); //求当前累积空数
//var_dump($m_v); var_dump($v);echo $t; $ret = CheckLimit( $nNum-count($m_v),$nBlk-$t); if ($ret) //检查满足题数的结果存在的可能性
{
if ($t == $nBlk) //情况一,得到方案返回真
{
return true;
}
else if ($t<$nBlk) //情况二,方案待完成
{
if (SituationVR($nNum ,$nBlk)) //递归,成功返回真失败继续
{
return true;
}
} //其它均为失败方案,继续即可
}
array_pop($m_v); //取值不当,出栈
}
//echo "<br>".$test_level."<";
//$test_level -= 1;
return false; //没有成功返回,默认返回假
} //测试
$m_blk = array(1, 2, 3);
$m_que = array(1, 5, 1);
$m_cnt = array(0, 0, 0, 0, 0);
$nNum = -1; //取几题,不限题数则置为非正数
$nBlk = 10; //取几个空 var_dump($m_blk);
var_dump($m_que);
echo "<br>";
if(CheckMax($nBlk))
{
$bRet = SituationVR($nNum ,$nBlk);//找出一个随机方案
echo "<br>";echo($bRet?"success! ":"failed! "); var_dump($m_v);
} ?>

为了PHP的这个算法 我也是操碎了心,增加了一些限制条件,导致算法变得略微复杂,后来 我还专门写了一个些范围和强度测试代码 ,并且自动检查取值 的正确性,啊其实这也算是另外一个小算法了,PHP不精,费了不少精力,不过好在证明出题算法没有什么问题,而且速度很快,满足了出题需求。

昨天回去的路上还在想,就像他们PHP的,宁愿写些半拉子代码也不愿去写个万能的算法最后非要等到别人送到嘴边才肯用。历害的是不是很多都是“业余的”,被跨专业打败。

常常喜欢用一个简洁的写法,这样也会带来一些阅读上的困难,严重的会引入逻辑上的错误,但是这也阻挡不了写法上的极致体验带来的爽感。

适用于填空题出题 的随机算法 PHP的更多相关文章

  1. 【Warrior刷题笔记】力扣169. 多数元素 【排序 || 哈希 || 随机算法 || 摩尔投票法】详细注释 不断优化 极致压榨

    题目 来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/majority-element/ 注意,该题在LC中被标注为easy,所以我们更多应该关 ...

  2. LOJ #2540. 「PKUWC 2018」随机算法(概率dp)

    题意 LOJ #2540. 「PKUWC 2018」随机算法 题解 朴素的就是 \(O(n3^n)\) dp 写了一下有 \(50pts\) ... 大概就是每个点有三个状态 , 考虑了但不在独立集中 ...

  3. HDU 4712 Hamming Distance(随机算法)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4712 解题报告:输入n个数,用十六进制的方式输入的,任意选择其中的两个数进行异或,求异或后的数用二进制 ...

  4. 随机算法 - HNU 13348 Finding Lines

    Finding Lines Problem's Link: http://acm.hnu.cn/online/?action=problem&type=show&id=13348&am ...

  5. [PKUWC2018]随机算法

    题意:https://loj.ac/problem/2540 给定一个图(n<=20),定义一个求最大独立集的随机化算法 产生一个排列,依次加入,能加入就加入 求得到最大独立集的概率 loj25 ...

  6. 浅浅地谈一下随机算法【poj2454】【poj3318】

    随机算法我也只是稍微接触了一下,就是想写篇博客自己稍微总结一下 其实随机算法也算是一个玄学吧,运气不好还是会wa.但是我们知道,计算机可以在短时间内计算大量的数据,所以碰到正确答案的概率还是挺大的. ...

  7. 【洛谷5492】[PKUWC2018] 随机算法(状压DP)

    点此看题面 大致题意: 用随机算法求一张图的最大独立集:每次随机一个排列,从前到后枚举排列中的点,如果当前点加入点集中依然是独立集,就将当前点加入点集中,最终得到的点集就是最大独立集.求这个随机算法的 ...

  8. [BJOI2014]想法(随机算法,神奇思路,拓扑排序)

    对于这种随机数据或者随机算法的题-- 都是神仙题吧. 要求的就是对每个点前 \(m\) 个点中有多少个可以到达它. 由于评分方式这么奇怪,不妨考虑随机. 随机 127 次(可以选别的数,够多而且不 T ...

  9. [Codeforces 364D]Ghd(随机算法+gcd)

    [Codeforces 364D]Ghd(随机算法) 题面 给出n个正整数,在其中选出n/2(向上取整)个数,要求这些数的最大公约数最大,求最大公约数的最大值 分析 每个数被选到的概率\(\geq \ ...

随机推荐

  1. tensorflow运行原理分析(源码)

    tensorflow运行原理分析(源码)  https://pan.baidu.com/s/1GJzQg0QgS93rfsqtIMURSA

  2. 【Bean】标签常用属性

    [Bean]标签常用属性 Id 说明:起名称,id属性值名称任意,不能包含特殊符号,根据id得到配置对象. Class 说明:创建对象所在类的全路径. Name 说明:功能和id是一样的,id属性值不 ...

  3. 远程桌面 虚拟打印 到本地打印机(虚拟化 终端 远程接入 RemoteApp)

    使用远程桌面或remoteapp进行打印时,若需使用本地的打印机,需要通过重定向方式,但本地打印机如果五花八门比较杂,那给服务器安装打印机驱动很麻烦. 其实可以借助虚拟打印机简化操作,省去给服务器安装 ...

  4. IntelliJ IDEA 2019.1.1 maven框架web.xml中web-app版本过低导致不能正常使用EL表达式的解决方案

     1.软件版本 IDEA版本:IntelliJ IDEA 2019.1.1 maven版本:apache-maven-3.6.1 Tomcat版本:tomcat-8.5 2.问题描述 IDEA使用如下 ...

  5. 关于MySQL的安装使用心得

    MySQL浅浅地学习了几天,当然还是转到正轨Java上来了,昨天打了一串代码,测试注解来着,结果MySQL挂了~~~ 如何干净卸载MySQL帖子有很多,不再赘述,注册表是个好东西~~ 卸载了Mysql ...

  6. 【监控笔记】【1.5】事件通知(event Notification)

    关键词:DDL监控 [监控笔记][1.5]事件通知(event Notification) 注意,只能通过删除新建来修改事件. [1]概念 事件通知是特殊类型的数据库对象,用于将有关服务器和数据库实践 ...

  7. 替换url不刷新页面

    今天碰到一个有趣的问题, 从其他站点登录后,放回了一个token, 但是我切换了路由之后token还在, 路由直接跟在了token参数后面, 后面先利用location.href替换掉原来的连接, 但 ...

  8. Self-Driving Database

    最近一直在做 ML in Database 相关的工作.偶然发现CMU 19spring的15-721课程竟然专门安排了这个专题,不禁欣喜若狂,赶紧去学习了一下. Andy提出了self-drivin ...

  9. luogu P1399 [NOI2013]快餐店

    传送门 注意到答案为这个基环树直径\(/2\) 因为是基环树,所以考虑把环拎出来.如果直径不过环上的边,那么可以在环上每个点下挂的子树内\(dfs\)求得.然后如果过环上的边,那么环上的部分也是一条链 ...

  10. Filter&Listener笔记

    ## 今日内容     1. Filter:过滤器     2. Listener:监听器 # Filter:过滤器     1. 概念:         * 生活中的过滤器:净水器,空气净化器,土匪 ...