适用于填空题出题 的随机算法 PHP
<?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的更多相关文章
- 【Warrior刷题笔记】力扣169. 多数元素 【排序 || 哈希 || 随机算法 || 摩尔投票法】详细注释 不断优化 极致压榨
题目 来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/majority-element/ 注意,该题在LC中被标注为easy,所以我们更多应该关 ...
- LOJ #2540. 「PKUWC 2018」随机算法(概率dp)
题意 LOJ #2540. 「PKUWC 2018」随机算法 题解 朴素的就是 \(O(n3^n)\) dp 写了一下有 \(50pts\) ... 大概就是每个点有三个状态 , 考虑了但不在独立集中 ...
- HDU 4712 Hamming Distance(随机算法)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4712 解题报告:输入n个数,用十六进制的方式输入的,任意选择其中的两个数进行异或,求异或后的数用二进制 ...
- 随机算法 - HNU 13348 Finding Lines
Finding Lines Problem's Link: http://acm.hnu.cn/online/?action=problem&type=show&id=13348&am ...
- [PKUWC2018]随机算法
题意:https://loj.ac/problem/2540 给定一个图(n<=20),定义一个求最大独立集的随机化算法 产生一个排列,依次加入,能加入就加入 求得到最大独立集的概率 loj25 ...
- 浅浅地谈一下随机算法【poj2454】【poj3318】
随机算法我也只是稍微接触了一下,就是想写篇博客自己稍微总结一下 其实随机算法也算是一个玄学吧,运气不好还是会wa.但是我们知道,计算机可以在短时间内计算大量的数据,所以碰到正确答案的概率还是挺大的. ...
- 【洛谷5492】[PKUWC2018] 随机算法(状压DP)
点此看题面 大致题意: 用随机算法求一张图的最大独立集:每次随机一个排列,从前到后枚举排列中的点,如果当前点加入点集中依然是独立集,就将当前点加入点集中,最终得到的点集就是最大独立集.求这个随机算法的 ...
- [BJOI2014]想法(随机算法,神奇思路,拓扑排序)
对于这种随机数据或者随机算法的题-- 都是神仙题吧. 要求的就是对每个点前 \(m\) 个点中有多少个可以到达它. 由于评分方式这么奇怪,不妨考虑随机. 随机 127 次(可以选别的数,够多而且不 T ...
- [Codeforces 364D]Ghd(随机算法+gcd)
[Codeforces 364D]Ghd(随机算法) 题面 给出n个正整数,在其中选出n/2(向上取整)个数,要求这些数的最大公约数最大,求最大公约数的最大值 分析 每个数被选到的概率\(\geq \ ...
随机推荐
- 细说python类3——类的创建过程
细说python类3——类的创建过程 https://blog.csdn.net/u010576100/article/details/50595143 2016年01月27日 18:37:24 u0 ...
- Grass Planting
大致题意: 维护一棵树,支持两种操作: P x y x到y路径上的每条边的值+1:Q x y 询问x到y路径上所有边的值的和.Input第一行两个正整数,N,M表示点数和操作数:接下来N-1行每行两个 ...
- [每天一课] 今天就讲一讲关于vue-cli 脚手架里 如何调用API
既然vue-resource停更了,就不讲了,但是效果也是差不多了 今天主要讲一下关于axios的方式来调用API,按照vue-cli的模式,这个当然得先引入一个axios这个模块了.那当然得走一遍终 ...
- ssh远程登录过程中卡住
1.首先排查网络连通性,查看网络是否通畅,远程端口是否开放 2.查看服务器复制,cpu,内存负载是否过大 3.检查ssh配置,查看以下配置是否这样配置 UseDNS no GSSAPIAuthenti ...
- window环境rabbitMQ安装和php扩展安装
下面的安装步骤,已经在2018-11-27试验通过. 1.安装前的准备 phpinfo查看php的版本.系统是多少位的,php版本是否是线程安全,php.ini文件的路径 2.安装rabbitMQ 安 ...
- (4.31)sql server中的xml数据操作
关键词:xml数据转为行列方式显示 常规案例: declare @data xml declare @h int set @data=' <bookstore> <row> & ...
- MySQL-快速入门(8)存储过程、存储函数
1.存储过程 1>创建存储过程:create procedure create procedure sp_name ([in | out | inout] param_name type) [c ...
- echart 柱状图 两个纵轴坐标 刻度不一样
在使用echart的过程中, 有的时候柱状图会使用两个纵坐标, 如果两个纵坐标的最大值是一样的还好,这样刻度也会一样. 但是多数情况下最大值是不一样的, 这样就造成了,刻度线很乱,显示不均匀. 解决办 ...
- tensorflow学习笔记一----------tensorflow安装
2016年11月30日,tensorflow(https://www.tensorflow.org/)更新了0.12版本,这标志着我们终于可以在windows下使用tensorflow了(但是还是推荐 ...
- 什么场景下用redis而不用mysql?
redis我们用作缓存,对查询速度要求比较高的应用场景比较适合.对有复杂逻辑关系的存储不适合. mysql是硬盘存储的,在高性能io要求的项目里不能满足需求,而redis所有数据存在内存里,因此要快得 ...