给定三个序列,长度分别为 x,y,zx, y, zx,y,z,你需要在三个序列里每个序列选一个数求和,有 x⋅y⋅zx \cdot y \cdot zx⋅y⋅z 种和,求从大到小前 kkk 个和。
最暴力的做法是枚举每一种和,然后排序求前 kkk 个,复杂度 O(xyzlog(xyz))O(xyz \log (xyz))O(xyzlog(xyz))。
注意到 1≤x,y,z≤1031 \leq x, y, z \leq 10^31≤x,y,z≤103,考虑低于三次方的做法。
可以考虑先枚举前两个序列的所有和,共 xyxyxy 个,接下来排序后取前 kkk 个和剩下的序列求和。
这个复杂度看起来也是平方的,显然当 k=xyk=xyk=xy 时,枚举的和仍然是 xyzxyzxyz 个。
但是注意 k≤min{3000,xyz}k \leq \min\{3000, xyz\}k≤min{3000,xyz},所以 kkk 的上限为 300030003000。可以接受。
复杂度为 O(xylog(xy))O(xy \log (xy))O(xylog(xy)) 左右,可以通过。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现