<?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. Python学习之==>Excel操作

    一.简介 使用Python读.写.修改excel分别需要用到xlrd.xlwt以及xlutils模块,这几个模块使用pip安装即可. 二.读excel import xlrd book = xlrd. ...

  2. Vue模版编译

    一 模版文件 <div> <header> <h1>I'm a template!</h1> </header> <p v-if=&q ...

  3. Android专项测试监控资源

    版本号 V 1.1.0 Android性能测试分为两类:1.一类为rom版本(系统)的性能测试2.一类为应用app的性能测试(本次主要关注点为app的性能测试) Android的app性能测试包括的测 ...

  4. 【ABAP系列】SAP ABAP 开发中的SMARTFORMS 参数

    公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[ABAP系列]SAP ABAP 开发中的SMA ...

  5. 获取win10壁纸

    执行命令会将所有壁纸拷贝到桌面上的wallpaper文件夹内 bat xcopy %LOCALAPPDATA%\Packages\Microsoft.Windows.ContentDeliveryMa ...

  6. 递归算法之排列组合-求一个集合S的m个元素的组合和所有可能的组合情况

    求一个集合S的m个元素组合的所有情况,并打印出来,非常适合采用递归的思路进行求解.因为集合的公式,本身就是递归推导的: C(n,m) = C(n-1,m-1) + C(n-1,m). 根据该公式,每次 ...

  7. 七、Zabbix-模板,应用集,监控项,触发器

    本篇内容,将模板,应用集,监控项,触发器放在一起,因为我们建立使用的监控项和触发器,大多数都是对多台机器使用的,很少有一个监控项对应一个主机的情况. 一.模板 1.什么是模板? 个人理解,模板就是模板 ...

  8. 六、Zabbix-自动分组

    一.配置Zabbix server 1.创建主机组 (2)配置—>主机群组—>创建主机群组 (2)Next Step (3)可以看到新添加的主机组 2.添加自动分组动作 配置—>动作 ...

  9. API接口设计

    1.场景描述 比如说我们要做一款APP,需要通过api接口给app提供数据.假设我们是做商城,比如我们卖书的.我们可以想象下这个APP大概有哪些内容: 1)首页:banner区域(可以是一些热门书籍的 ...

  10. [转帖]mysql数据库主从配置

    mysql数据库主从配置 https://www.toutiao.com/i6680489302947791371/ 多做实验 其实挺简单的 很多东西 要提高自信 去折腾. 架构与我 2019-04- ...