)
科学计算【免费下载链接】codeforces-go算法竞赛模板库 by 灵茶山艾府 项目地址https://gitcode.com/GitHub_Trending/co/codeforces-go点击查看免费下载本篇技术指南围绕力扣双周赛第 184 场第二题《Minimum Energy to Maintain Brightness》展开以 leetcode/biweekly/184/b/README.md 的官方题解为核心骨架结合 codeforces-go 仓库中对应的 b.go、b_test.go 与 b.txt 源码级佐证完整讲解贪心计数 合并区间的解题范式。读完本文你将掌握如何把一个带取整约束的最小化问题转化为合并区间求覆盖长度的经典模型以及该模型在 Python、Java、C、Go 四种语言下的可直接复用的实现并理解该题解在仓库测试框架中的落地方式。题目核心一个灯泡只能照亮 3 个位置题目要求维持至少brightness的总照明度而每个已开启的灯泡恰好覆盖 3 个连续单位位置。因此至少要开启多少个灯泡是一个简单的取整问题$$ \textit{bulbs} \left\lceil\dfrac{\textit{brightness}}{3}\right\rceil \left\lfloor\dfrac{\textit{brightness} 2}{3}\right\rfloor $$即每个灯泡贡献固定 3 个单位照明度向上取整即可。由于brightness是整数ceil(brightness / 3)与(brightness 2) / 3整数除法完全等价。从仓库实现 b.go 可以看到对应的 Go 写法bulbs : (brightness 2) / 3 // 至少要开启 bulbs 个灯泡题目函数签名为minEnergy(_, brightness int, intervals [][]int) int64其中第一个参数n单位时间总数在解题过程中并不参与计算因此用_忽略intervals表示可供开启灯泡的候选位置区间每个单位时间只能放置一个灯泡。关键转化被覆盖单位时间的数量 合并区间后的长度之和题目给出的intervals可能彼此重叠。我们需要知道的是一共有多少个互不重复的单位时间可以放置灯泡。这正是 56. 合并区间 的变体——不输出合并后的区间集合只累计合并结果中每个区间的整数长度。设合并后各区间的长度之和为sumLen那么整体答案就是$$ \textit{bulbs}\cdot \textit{sumLen} $$即在每一个可放置灯泡的单位时间上为了达到总照明度都需要开启bulbs个灯泡。为什么可以这样合并若区间相交l right说明左右两个候选区间可以连成一片把右端点扩展到更远的位置right max(right, r)从而避免重复计数若区间不相交l right则把当前已经合并完的区间长度right - left 1累加进sumLen然后开启一个新的合并区间。注意长度用right - left 1计算因为单位时间是离散的整数点闭区间[left, right]内的整数个数为right - left 1。合并区间的标准写法只算长度不输出区间Go 实现仓库中的实际实现位于 b.go与题解文档中的sol-Go完全一致package main import slices func minEnergy(_, brightness int, intervals [][]int) int64 { slices.SortFunc(intervals, func(p, q []int) int { return p[0] - q[0] }) // 按照左端点从小到大排序 // 56. 合并区间只计算区间长度之和 sumLen : 0 left, right : 0, -1 for _, p : range intervals { if p[0] right { // 左端点在合并区间内可以合并 right max(right, p[1]) // 更新合并区间的右端点 } else { // 不相交无法合并 sumLen right - left 1 left, right p[0], p[1] // 新的合并区间 } } sumLen right - left 1 bulbs : (brightness 2) / 3 // 至少要开启 bulbs 个灯泡 return int64(bulbs * sumLen) }实现细节要点必须先按左端点排序slices.SortFunc以p[0] - q[0]作为比较器保证后续的线性扫描能够正确判断相邻区间是否相交初始哨兵right -1由于区间左端点最小为 0right -1可以保证第一个区间必然走else分支进入新合并区间逻辑循环结束后再累加一次最后一个合并区间在循环内只更新了left/right需要退出循环后把right - left 1补进sumLen类型转换bulbs * sumLen可能超出 32 位整数范围Go 版本返回int64(bulbs * sumLen)。Python 实现class Solution: def minEnergy(self, _, brightness: int, intervals: list[list[int]]) - int: intervals.sort(keylambda p: p[0]) # 按照左端点从小到大排序 # 56. 合并区间只计算区间长度之和 sum_len 0 left, right 0, -1 for l, r in intervals: if l right: # 左端点在合并区间内可以合并 right max(right, r) # 更新合并区间的右端点 else: # 不相交无法合并 sum_len right - left 1 left, right l, r # 新的合并区间 sum_len right - left 1 bulbs (brightness 2) // 3 # 至少要开启 bulbs 个灯泡 return bulbs * sum_lenPython 中(brightness 2) // 3即为ceil(brightness / 3)与公式等价。Java 实现class Solution { public long minEnergy(int n, int brightness, int[][] intervals) { Arrays.sort(intervals, (p, q) - p[0] - q[0]); // 按照左端点从小到大排序 // 56. 合并区间只计算区间长度之和 int sumLen 0; int left 0; int right -1; for (int[] p : intervals) { if (p[0] right) { // 左端点在合并区间内可以合并 right Math.max(right, p[1]); // 更新合并区间的右端点 } else { // 不相交无法合并 sumLen right - left 1; left p[0]; right p[1]; // 新的合并区间 } } sumLen right - left 1; int bulbs (brightness 2) / 3; // 至少要开启 bulbs 个灯泡 return (long) bulbs * sumLen; } }注意 Java 版本在最后(long) bulbs * sumLen处显式做类型提升避免乘法溢出这是与 C/Go 版本保持一致的必要细节。C 实现class Solution { public: long long minEnergy(int, int brightness, vectorvectorint intervals) { ranges::sort(intervals, {}, [](auto p) { return p[0]; }); // 按照左端点从小到大排序 // 56. 合并区间只计算区间长度之和 int sum_len 0; int left 0, right -1; for (auto p : intervals) { if (p[0] right) { // 左端点在合并区间内可以合并 right max(right, p[1]); // 更新合并区间的右端点 } else { // 不相交无法合并 sum_len right - left 1; left p[0]; right p[1]; // 新的合并区间 } } sum_len right - left 1; int bulbs (brightness 2) / 3; // 至少要开启 bulbs 个灯泡 return 1LL * bulbs * sum_len; } };C 版本使用ranges::sort配合投影p[0]完成按左端点排序用1LL * bulbs * sum_len防溢出。复杂度分析时间复杂度$\mathcal{O}(n\log n)$其中 $n$ 是intervals的长度。瓶颈在于排序排序之后对区间的单次线性扫描仅需 $\mathcal{O}(n)$。空间复杂度$\mathcal{O}(1)$。除输入本身外只使用了常数个变量sumLen、left、right、bulbs忽略排序的栈开销。仓库源码印证从题解到可运行实现与测试实现与文档一一对应该题解在仓库中的落地产物是 leetcode/biweekly/184/b/b.go其minEnergy函数与文档中的sol-Go代码逐行一致且同样引入了slices标准库完成排序。整个比赛的四道题a/b/c/d分别放置在 leetcode/biweekly/184 目录下每道题由README.md题解说明、.go实现、.txt测试数据、_test.go测试入口四个文件组成。测试框架如何驱动测试入口 b_test.go 由 copypasta/template/leetcode/generator_test.go 自动生成其核心一行是if err : testutil.RunLeetCodeFuncWithFile(t, minEnergy, b.txt, 0); err ! nil { t.Fatal(err) }RunLeetCodeFuncWithFile定义在 leetcode/testutil/leetcode.go它按函数签名反射出参数个数NumIn与返回值个数NumOut将文本文件按每fNumIn fNumOut行一组切分为测试用例再逐一通过反射调用被测函数并与期望输出比对。这也解释了为什么b.txt中每个用例由 3 行输入n、brightness、intervals 1 行输出构成。逐条解读仓库中的测试数据b.txt 内嵌了 3 组用例逐一验证解题逻辑n5, brightness5, intervals[[6,12]]区间长度 7bulbs ceil(5/3) 2答案2 × 7 14n2, brightness1, intervals[[0,0],[2,2]]两个不相交区间各长 1sumLen 2bulbs 1答案2n4, brightness2, intervals[[1,3],[2,4]]区间相交合并为[1,4]sumLen 4bulbs 1答案4。第 3 组用例正是对区间重叠时不能重复计数这一核心逻辑的直接验证若直接3 3 6会得到错误答案而合并后仅计4个单位时间。在仓库根目录下运行go test ./leetcode/biweekly/184/b/即可执行上述全部用例该仓库 Go 模块名为github.com/EndlessCheng/codeforces-go见 go.mod。延伸合并区间模板在仓库中的通用形态合并区间作为区间贪心问题的基础操作在仓库模板库 copypasta/misc.go 中也有通用实现mergeIntervals(a [][]int) [][]int它输出合并后的完整区间集合适用于需要保留结果区间的场景而本题解只关心区间长度之和因此直接在线性扫描中累加right - left 1省去了构造结果切片的开销。两种写法共享同一个核心不变量先按左端点排序再维护当前合并区间的[left, right]遇相交则右扩遇不相交则结算上一个区间。这一算法在力扣题解中被归入贪心题单的「§2.5 合并区间」专题是区间覆盖 / 区间合并 / 区间选点三类区间贪心问题的公共前置技能。掌握它之后无论是求覆盖总长度、求最大不相交区间个数还是判断区间是否完全覆盖都可以在排序 单次扫描的框架内快速套用。小结两个独立步骤的解耦先由brightness通过ceil(brightness / 3)求出所需灯泡数bulbs再通过合并区间求出可放置灯泡的互不重复单位时间总数sumLen两者相乘即为答案正确性的两个支点合并区间保证每个单位时间只被计数一次取整公式保证灯泡数恰好满足亮度需求复杂度$\mathcal{O}(n\log n)$ 排序 $\mathcal{O}(n)$ 扫描空间 $\mathcal{O}(1)$仓库落地实现见 b.go测试数据见 b.txt测试驱动见 b_test.go通用合并区间模板见 misc.go。赞分享科学计算【免费下载链接】codeforces-go算法竞赛模板库 by 灵茶山艾府 项目地址https://gitcode.com/GitHub_Trending/co/codeforces-go点击查看免费下载相关推荐LeetCode 1167 Minimum Cost to Connect Sticks最小堆贪心合并算法全解含 9 种语言实现LeetCode 1167 Minimum Cost to Connect Sticks最小堆贪心合并算法全解含 9 种语言实现 本文以 LeetCode示例工程教程力扣双周赛 177 Q2「合并相近字符」的栈消除写法与 Go 实现剖析力扣双周赛 177 Q2「合并相近字符」的栈消除写法与 Go 实现剖析 本篇围绕力扣双周赛 177 第 2 题 mergeCharacters 题名 mer科学计算力扣双周赛 151 Q2Copy Arrays 计数问题——差分推导与区间交集解法codeforces-go 仓库源码解析力扣双周赛 151 Q2Copy Arrays 计数问题——差分推导与区间交集解法codeforces go 仓库源码解析 本文以算法竞赛模板库 code科学计算上一篇LifeOS ThreatLandscape 威胁情报模板用 Deep Investigation 工作流构建可迭代的网络安全威胁态势图谱下一篇3分钟快速上手在PowerPoint中无缝使用LaTeX公式的完整指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考