1. <?php
  2. #寻找一个满足给定空数和题数要求的随机方案,事先需统计出每题空格数情况队列$m_blk,以及这些题分别有多少个$m_que。
  3. #以下算法将找到一个随机方案,若未找到将返回假值,如果不限题数,请将题数置为不大于0的数。
  4.  
  5. $m_v = array(); //目标随机方案
  6.  
  7. $m_blk = array(); //空格数情况,从小到大排列
  8. $m_que = array(); //空格题数
  9.  
  10. $m_cnt = array(); //取出的某空格数的题数
  11.  
  12. //$test_level = 0; //测试变量
  13.  
  14. function CheckQue($i) //检查题数是否够取,$i为已取的相应空格数题的数量
  15. {
  16. global $m_que;
  17. global $m_cnt;
  18. echo " CheckQue ".$i."_".$m_cnt[$i]."<".$m_que[$i]."; ";
  19. return ($m_cnt[$i] <= $m_que[$i]); //取值正常,已经不可能取到这么多题时,返回错误
  20. }
  21. function CheckLimit($num, $blk) //检查剩下的空数与题数是否有可能的解
  22. {
  23. echo " Limit num".$num.", blk".$blk."; ";
  24. global $m_blk;
  25. return $num>=0?($num*$m_blk[count($m_blk)-1]>=$blk && $num*$m_blk[0]<=$blk):true;
  26. }
  27. function CheckMax($blk) //检查一次题库中空数是否存在选出总空数的可能
  28. {
  29. global $m_blk;
  30. global $m_que;
  31. $t = 0;
  32. for($i=0; $i<count($m_que); $t+=$m_que[$i]*$m_blk[$i],++$i);
  33. echo " t ".$t." blk ".$blk."; ";
  34. return $t>=$blk;
  35. }
  36.  
  37. function SituationVR($nNum , $nBlk) //找到一个方案并返回。nNum目标题数,nBlk目标空数,v每题空格数,且从小到大排列
  38. {
  39. //global $test_level;//测试
  40. //$test_level += 1;
  41. //echo "<br>".$test_level.">";
  42.  
  43. global $m_v;
  44. global $m_blk;
  45. global $m_cnt;
  46.  
  47. $v = array_keys($m_blk); //拷贝一个原空数队列的序列出来作为新数列去取序号,这样使得$m_cnt可准确计数
  48.  
  49. for ( $i=0; count($v)>0; $m_cnt[$i] -= 1)
  50. {
  51. echo "<br>"."#";
  52. $ii = mt_rand(0,count($v)-1); //取一题空数为$i,并将记录删除已取过的序号,取出来的是序号的序号
  53. $i = $v[$ii]; //空格队列索引
  54. $b = $m_blk[$i]; //空格数
  55. $m_cnt[$i] += 1; //计数
  56. unset( $v[$ii]);
  57. $v = array_values($v);
  58. echo " ii".$ii." i".$i." b".$b."; ";
  59.  
  60. if (!CheckQue($i)) //检查取题数是否正常范围,超出重取,取不出返回假
  61. {
  62. continue;
  63. }
  64.  
  65. array_push($m_v, $b); //进栈
  66. $t = array_sum($m_v); //求当前累积空数
  67. //var_dump($m_v); var_dump($v);echo $t;
  68.  
  69. $ret = CheckLimit( $nNum-count($m_v),$nBlk-$t);
  70.  
  71. if ($ret) //检查满足题数的结果存在的可能性
  72. {
  73. if ($t == $nBlk) //情况一,得到方案返回真
  74. {
  75. return true;
  76. }
  77. else if ($t<$nBlk) //情况二,方案待完成
  78. {
  79. if (SituationVR($nNum ,$nBlk)) //递归,成功返回真失败继续
  80. {
  81. return true;
  82. }
  83. } //其它均为失败方案,继续即可
  84. }
  85. array_pop($m_v); //取值不当,出栈
  86. }
  87. //echo "<br>".$test_level."<";
  88. //$test_level -= 1;
  89. return false; //没有成功返回,默认返回假
  90. }
  91.  
  92. //测试
  93. $m_blk = array(1, 2, 3);
  94. $m_que = array(1, 5, 1);
  95. $m_cnt = array(0, 0, 0, 0, 0);
  96. $nNum = -1; //取几题,不限题数则置为非正数
  97. $nBlk = 10; //取几个空
  98.  
  99. var_dump($m_blk);
  100. var_dump($m_que);
  101. echo "<br>";
  102. if(CheckMax($nBlk))
  103. {
  104. $bRet = SituationVR($nNum ,$nBlk);//找出一个随机方案
  105. echo "<br>";echo($bRet?"success! ":"failed! "); var_dump($m_v);
  106. }
  107.  
  108. ?>

为了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. golang error (slice of unaddressable value)

    使用 Golang 将生成的 md5 转化为 string 的过程出现如下编译错误: 错误解析: 值得注意的一点是  func Sum(data []byte) [Size]byte  这个函数返回的 ...

  2. oracle data guard --理论知识回顾01

    之前搭建了rac到单实例的dg环境,最近又在windows下搭建了dg,这一篇关于dg的一些理论知识回顾 官方文档 https://docs.oracle.com/cd/E11882_01/nav/p ...

  3. elasticsearch7.0安装及配置优化

    简单讲ES开箱即用,不用任何配置也能玩转搜索引擎:以下内容是根据易企秀线上实际使用场景进行的安装和配置,支持冷热数据分离 1.安装 Linux 环境下载安装包 curl -L -O https://a ...

  4. 6.824 Lab 3: Fault-tolerant Key/Value Service 3A

    6.824 Lab 3: Fault-tolerant Key/Value Service Due Part A: Mar 13 23:59 Due Part B: Apr 10 23:59 Intr ...

  5. Vim文本编辑工具

    4文本编辑工具Vim Vim是vi的升级版,编辑文本时vi不会显示颜色而vim会显示颜色. 安装vim工具 #yum  install  –y  vim-enhanced Vim有三种模式:一般模式. ...

  6. Vim常用的功能命令

    一.编辑 查看行号     :set nu 删除一整行   dd 删除1到10行     :1,10d 删除所有内容     dG 当前行下插入一空行   o 撤销改动    u 查看当前行信息    ...

  7. vue组件注册(极客时间Vue视频笔记)

    vue组件注册 组件是为了方便代码复用,只需引入组件即可在不同的地方使用想同的功能代码 <body> <div class="app"> <todo- ...

  8. CentOS7linux通过http配置共享自动创建yum源的shell脚本

    因工作需要用到,所以记录一下配置流程 环境介绍: 两台CentOS7系统 yum源服务主节点IP:192.168.1.78 从节点IP:192.168.1.79(79从78上获取yum源) 配置78节 ...

  9. [Git] 019 merge 命令的补充

    回顾:[Git] 017 加一条分支,享双倍快乐 的 "2.3" 1. "Fast-forward" "Git" 在合并分支时会尽可能地使用 ...

  10. springboot无法找到mapper😵

    今天在学习springboot的过程中遇到mapper无法找到的问题,困扰了很久