【语法】
一、隐蔽陷阱
用最少的广告牌覆盖 1 到 50 公里的路段:随手按报名顺序选牌子,选完发现中间留了一段 8 公里的空档谁也没盖住——选牌顺序错了,贪心才有最优解。
二、底层原理
区间覆盖贪心:候选区间按左端点排序,每轮在能覆盖当前起点的区间里选右端点最远的那个,选完把起点推进到它的右端点;起点推进不到下一区间则无解。覆盖相同花费时,伸得最远的选择给后面留最多余地。
三、正确代码
基础写法(按左端点排序):
local function sortSegs(segs)
table.sort(segs, function(a, b)
return a[1] < b[1]
end)
return segs
end
进阶写法(贪心覆盖计数):
local function cover(segs, target)
segs = sortSegs(segs)
local start, used, i = 1, 0, 1
while start <= target and i <= #segs do
local far = start - 1
while i <= #segs and segs[i][1] <= start do
far = math.max(far, segs[i][2])
i = i + 1
end
if far < start then return -1 end
used = used + 1
start = far + 1
end
return start > target and used or -1
end
local p = getplayerbyname("cover01")
sendmsg(p, 1, "最少广告牌 "
.. cover({{1, 10}, {5, 20}, {20, 50}, {30, 60}}, 50))
四、引擎验证
四块广告牌覆盖 1 到 50,贪心选出 3 块(1-10、5-20、20-50);去掉 20-50 那块则返回 -1 表示无解。
五、FAQ
问:为何选右端点最远?
答:同起点的选择中它给后面留最多余地。
问:排序为何按左端点?
答:保证候选区间盖住当前起点。
全站技术干货持续更新:996 引擎 / Lua 实战帖,语法、参数与示例一篇讲透。进入文章地图 · 查看全部 →
【游戏功能】 一、一个砸不准的跳劈 腾空下劈类技能的第一版,玩家按下技能,角色跳出了屏幕上沿,然后……凭空掉回来,砸没砸中人…
【游戏功能】 一、一个拽回人的钩子 钩子类技能是全游戏最依赖判定的一个:钩子飞出去要咬中、咬中要拖回来、拖回来还要打得到——…
【游戏功能】 一、一行代码拆解 ctx.fillRect(70, aimY - W / 2, 590, W) ——终极光束的…
【游戏功能】 一、一次砸偏了的轰炸 空中支援类技能第一版测试,轰炸区画得漂漂亮亮,炸弹也一枚枚落下来了,测试的评语只有四个字…
【游戏功能】 一、一次分了三岔的火球 多重火球类技能首版的动图看着很美:大火球半路裂成三枚小火球扇形散开——然后三枚全飞偏了…
【游戏功能】 一、一笔判生死的墨迹 书法系技能上线测试,美术交来的墨迹特效是一整张黑色贴图从左飞到右,测试评语"像块抹布"。…