资讯详情

codeforces-go 力扣双周赛 168 题解:数位平方和最大化的贪心构造与字典序细节

发布时间:2026/10/7 9:52:14

500+
企业客户服务经验
120+
行业领域内容覆盖
3000+
原创页面设计沉淀
98%
客户满意度

codeforces-go 力扣双周赛 168 题解:数位平方和最大化的贪心构造与字典序细节

科学计算【免费下载链接】codeforces-go算法竞赛模板库 by 灵茶山艾府 项目地址https://gitcode.com/GitHub_Trending/co/codeforces-go点击查看免费下载本篇技术指南以 leetcode/biweekly/168/b/README.md 为核心骨架完整讲解力扣双周赛 168 第二题「数位平方和最大化」的贪心推导、四语言实现与复杂度分析并结合本仓库的 Go 实现 b.go、测试数据 b.txt 与测试用例 b_test.go从源码级验证贪心策略的正确性与可复现性。读完本文你将掌握数位分配最不均匀时平方和最大这一贪心结论的证明思路以及先填最大数位、后补零的字典序最大化构造模板。一、题目重述与核心目标给定两个整数n与sum要求构造一个恰好包含n位数字的十进制数允许前导零因此用字符串表示满足各位数字之和恰好等于sum各位数字的平方和尽可能大在满足前两个条件的所有结果中输出字典序最大的那个字符串若不存在任何合法构造即无解返回空字符串。本题将sum简记为s。仓库中的测试数据 b.txt 给出了三组代表性样例可直观感受题目形态输入n, sum输出说明2, 330数位和 3 的可选串有12/21/30平方和分别为 5、5、930最大2, 179817 9 898与89平方和同为 145但98字典序更大1, 10一位数字最大为 9数位和 10 无法达成无解整个求解过程分为三块无解判定 → 贪心分配数位 → 字典序最大化。二、无解判定所有位都填 9 仍不够构造时每一位数字的上限是 9因此n位数字能提供的数位和上限为9n。如果n * 9 sum说明即使每一位都填 9数位和仍然达不到sum此时不存在任何合法字符串直接返回空串。这一判定条件在四种语言的实现中完全一致if n*9 sum { return }if n * 9 s: return if (n * 9 sum) { return ; }if (n * 9 sum) { return ; }从仓库实现看b.go 的第一行即为此无解分支b.txt中第三组用例n1, sum10正是专门验证该分支的边界数据。三、贪心核心平方和最大化等价于数位分布最不均匀解决了无解判定后真正的问题在于如何在数位和固定的约束下让平方和最大3.1 直观例子90 优于 54原文档给出了一个精炼的例子把数位和 9 拆成90还是549² 815² 4² 25 16 41显然9² 5² 4²所以拆分成90更优。也就是说与其把数字均摊到多个数位上不如集中到少数数位上。3.2 凸函数依据分布越不均匀平方和越大一般化地看平方和是若干非负变量的平方之和。设各位数字为x₁, x₂, …, xₙ约束为Σxᵢ sum目标为最大化Σxᵢ²。由于f(x) x²是凸函数二阶导数恒为正根据凸函数的基本性质在固定和的约束下变量取值越不均匀、越向端点聚集函数值越大反之越均匀各变量尽量相等函数值越小。因此最优解一定把数字尽量集中在尽可能少的数位上且集中的那个数位取到可能的最大值 9。这就是把 9 拆成 90 更好这一直觉背后的数学原理9与0的分布是所有可行分布中最不均匀的一种。3.3 构造规则由上述结论为使平方和最大应该先填⌊sum / 9⌋个9——把数位和尽可能多地压进高位数字 9 中如果sum mod 9 0剩余的数位和不足 9就再填一个sum mod 9最后填入n - |ans|个0其中|ans|是当前答案串的长度用 0 把剩余位数补齐。三步构造出的串天然满足数位分布最不均匀从而平方和最大。需要说明的是0不贡献任何平方和因此补零的数量只影响长度与字典序不影响平方和。四、字典序最大化9 在前、余数居中、0 垫底题目要求的是字典序最大的合法构造而字典序比较规则是越靠前的字符越大整个串就越大。因此字典序最大化等价于一个贪心填位问题字符9是最大的数字字符必须尽可能靠前、尽可能多地使用若存在余数位sum mod 9取值 18它必然紧跟在所有9之后0是最小的数字字符全部放在串尾。例如n2, sum17时17 9×1 8先填一个9再填8补0到长度 2——得到98。它与89的平方和相同都是 145但字典序98 89所以98才是正确答案这也正是 b.txt 中第二组用例的预期输出。该构造顺序与原文档给出的三条规则完全吻合是平方和最大与字典序最大两个目标的最优统一。五、四种语言完整实现原文档完整给出了 Python3、Java、C、Go 四种语言的实现这里全部保留并标注关键行Go即仓库源码func maxSumOfSquares(n, sum int) string { if n*9 sum { return } ans : strings.Repeat(9, sum/9) if sum%9 0 { ans string(0 byte(sum%9)) } return ans strings.Repeat(0, n-len(ans)) }这就是仓库中 b.go 的完整内容利用strings.Repeat一次性构造9 块、余数块、0 块三段拼接即得答案。0 byte(sum%9)将 18 的余数转换为对应字符。Python3class Solution: def maxSumOfSquares(self, n: int, s: int) - str: if n * 9 s: return ans 9 * (s // 9) if s % 9: ans digits[s % 9] return ans 0 * (n - len(ans))Javaclass Solution { public String maxSumOfSquares(int n, int sum) { if (n * 9 sum) { return ; } StringBuilder ans new StringBuilder(n).repeat(9, sum / 9); if (sum % 9 0) { ans.append((char) (0 sum % 9)); } ans.repeat(0, n - ans.length()); return ans.toString(); } }Cclass Solution { public: string maxSumOfSquares(int n, int sum) { if (n * 9 sum) { return ; } string ans(sum / 9, 9); if (sum % 9) { ans 0 sum % 9; } return ans string(n - ans.size(), 0); } };四种语言的逻辑完全同构先做无解判定再依次拼接三个字符块时间复杂度与空间复杂度一致。六、复杂度分析时间复杂度O(n)。无论是strings.Repeat、字符串乘法还是StringBuilder本质上都要生成长度恰为n的字符串即 O(n)。空间复杂度O(n) 或 O(1)。Go/Python/C 直接生成新串需要 O(n) 空间Java 在StringBuilder内部完成拼接若不计返回值可视为 O(1) 额外空间。原文档明确指出返回值不计入。七、仓库源码级验证实现、测试数据与测试框架7.1 实现文件与样例数据的对应关系仓库为本题维护了三个配套文件b.gomaxSumOfSquares的 Go 实现与上文代码逐字一致b.txt三组样例数据输入参数 预期输出按每2 参数 1 输出行一组的格式组织b_test.go调用测试框架运行上述数据的测试入口。7.2 测试是如何跑起来的b_test.go 的核心调用是func Test_b(t *testing.T) { if err : testutil.RunLeetCodeFuncWithFile(t, maxSumOfSquares, b.txt, 0); err ! nil { t.Fatal(err) } }其背后依赖 leetcode/testutil/leetcode.go 中的RunLeetCodeFuncWithFile它读取b.txt按函数签名2 个入参 1 个返回值把文件内容分组为用例再交由RunLeetCodeFuncWithExamples通过反射调用maxSumOfSquares逐用例断言输出是否与文件中的预期串相等若超时还会借助isTLE机制报超时。值得说明的是这些测试骨架是由仓库的题解生成器自动产出的copypasta/template/leetcode/generator.go 中的GenLeetCodeTests系列函数负责登录力扣、抓取比赛题目、解析样例并生成a.go / a.txt / a_test.go等文件因此b_test.go顶部注释写明Generated by copypasta/template/leetcode/generator_test.go。这意味着b.txt中的数据在生成时即与官方样例对齐本文讲解的三组用例与仓库实际可运行的测试完全一致。7.3 用测试数据反推边界b.txt三组用例恰好覆盖三条关键路径n2, sum3 → 30验证余数块 补零路径3 9×0 3答案为3后补 1 个 0n2, sum17 → 98验证9 块 余数块路径同时隐含字典序约束98而非89n1, sum10 → 验证无解分支1×9 9 10。八、题型归类与后续训练本题是典型的贪心 构造问题同时涉及字典序最小/最大这一高频考察点。原文档将其归入贪心题单的「§3.1 字典序最小/最大」专题。同一场双周赛 168 的其他三题也都有仓库内配套实现与题解文档可作为连贯训练Q1 题解文档枚举反转前缀/后缀的暴力做法并附后缀数组 稀疏表 O(n log n) 优化属于字符串 字典序专题Q3、Q4贪心分类讨论与动态规划/容斥方向均位于 leetcode/biweekly/168 目录下。建议按先掌握贪心证明 → 再吃透字典序构造 → 最后用仓库测试跑通的顺序消化本题即可同时拿下平方和最大化与字典序最大化两类构造题的通用套路。赞分享科学计算【免费下载链接】codeforces-go算法竞赛模板库 by 灵茶山艾府 项目地址https://gitcode.com/GitHub_Trending/co/codeforces-go点击查看免费下载相关推荐Kornia 视差图指标 dtype 强制校验从貌似正确的错误分数到显式报错的破坏性变更解析Kornia 视差图指标 dtype 强制校验从貌似正确的错误分数到显式报错的破坏性变更解析 本篇文章围绕 Kornia 仓库中的变更记录 changel科学计算codeforces-go 实战贪心 最大堆 差分数组求解「零数组变换 III」力扣双周赛 144 C 题codeforces go 实战贪心 最大堆 差分数组求解「零数组变换 III」力扣双周赛 144 C 题 导读 本文基于 codeforces科学计算codeforces-go 中的「从最大元素开始贪心」力扣双周赛 140 T2《最大化独特塔楼的总高度》题解全析codeforces go 中的「从最大元素开始贪心」力扣双周赛 140 T2《最大化独特塔楼的总高度》题解全析 导读 本文以当前仓库 codeforces科学计算上一篇终极解决方案3分钟让你的魔兽争霸III在现代系统上焕然新生下一篇Sunshine游戏串流终极指南如何免费打造你的家庭游戏共享平台创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
热门专题

继续阅读更多专题内容

围绕企业服务、数字化转型与官网运营的常青话题,持续输出深度内容

企业官网建设指南 企业托管服务模式 财税政策与解读 企业数字化转型 官网SEO与获客 网站安全与运维
配套服务

读完这篇文章,了解更多服务

从整站搭建到SEO布局,17项核心服务助您打造高转化的企业官网

01

企业托管整站搭建

从信息架构到栏目预留,搭建可生长的企业站点骨架,每个页面独立原创设计。...

了解详情
02

规整可信网页设计

雪地靴温暖风原创设计,金属铜线条贯穿全页,拒绝通用模板与AI流水线。...

了解详情
03

企业服务SEO布局

关键词体系与语义化结构,从建站源头为搜索排名而生。...

了解详情
04

业务预约咨询表单

多场景表单与线索收集体系,把访问流量转化为可追踪的销售线索。...

了解详情
05

企业服务站点运维

安全巡检、数据备份与内容更新支持,全年守护网站稳定运行。...

了解详情
06

全终端商务适配

电脑、平板、手机一致呈现,移动端体验与转化同样出色。...

了解详情
需要专业建议?

让专业顾问为您解读行业趋势

关于企业官网建设、SEO获客与数字化转型的任何疑问,欢迎一对一咨询我们的专业顾问。