【语法】
一、机制原理
抛坑提问:手里有八百颗强化石,单颗强化固定消耗,最高能把装备强化到几星?从一星逐级往上试,试到失败为止当然能算出来,可材料池一变就要重算一遍,级数一高更是白跑大半程。二分答案专门收拾这类问题:只要"能不能达到 k 星"这件事随 k 增大而单调——能到 k 星就必然能到更低的星——那么答案空间就是一段"先全是假、后全是真"的折线,用二分在真假交界处收缩,几十次判定就能锁定临界点。它与二分查找的区别要说清:二分查找是在现成的有序数组里找值,二分答案是对一个"判定函数"搜索边界,数组都不需要有,只需要判定函数单调。
二、错误写法
-- 错误:从低星逐级试到失败,级高时白跑大半程
local star = 0
while canReach(star + 1, stones) do
star = star + 1
end
三、正确写法
local function canReach(star, stones, perStar)
return stones >= star * perStar
end
local function maxStar(stones, perStar, cap)
local lo, hi = 0, cap
while lo < hi do
local mid = math.ceil((lo + hi) / 2)
if canReach(mid, stones, perStar) then
lo = mid
else
hi = mid - 1
end
end
return lo
end
local label = panel:getChildByName("starText")
label:setString(tostring(maxStar(800, 20, 60)))
四、引擎验证
八百石、每星二十石的上限判定,二分五轮锁定四十星;石数减半后自动重算出新的临界星数。
五、FAQ
问:怎么确认问题适合二分答案?
答:先证明判定函数单调——k 可行则更小必可行,才有真假分界。
问:mid 的取整方向怎么定?
答:求最大可行值向上取整,求最小可行值向下取整,方向反了会死循环。
全站技术干货持续更新:996 引擎 / Lua 实战帖,语法、参数与示例一篇讲透。进入文章地图 · 查看全部 →
【语法算法】 next 的遍历本质就这一行: 传入上一个键,返回下一个键值对——不传上一个键就从第一个开始——next 是 …
【语法算法】 返回值的截取本质就这一行: 函数返回三个值,左侧三个变量各接一个——多余的返回值被丢弃,不足的补 nil——多…
【语法算法】 collectgarbage 的分步回收就这一行: "step" 模式让 GC 执行一步增量回收——参数 20…
【语法算法】 gmatch 的迭代本质就这一行: gmatch 返回一个迭代函数——每次调用返回下一个匹配——遍历完返回 n…
【语法算法】 xpcall 的错误处理函数就这一行: xpcall 和 pcall 的本质区别就一个:xpcall 可以传入…
【语法算法】 元方法 __index 设为函数的本质就这一行: 读取表中不存在的键时,Lua 调用 __index 函数——…