青训营X豆包MarsCode技术训练营 | 豆包MarsCode Al 刷题

67 阅读3分钟

数组构造问题解析 题目: 小C希望构造一个包含n个元素的数组,且满足以下条件: 数组中的所有元素两两不同。 数组所有元素的最大公约数为 k。 数组元素之和尽可能小。 任务是输出该数组元素之和的最小值。 测试样例 样例1: 输入:n = 3 ,k = 1 输出:6 样例2: 输入:n = 2 ,k = 2 输出:6 样例3: 输入:n = 4 ,k = 3 输出:30 解题代码: #include #include #include

using namespace std;

int solution(int n, int k) {     // 确保 k 是正数     if (k <= 0) return 0;

    // 初始化数组和总和     int sum = 0;     vector arr;

    // 从 k 开始,依次选择 k 的倍数,直到数组中有 n 个元素     for (int i = 1; arr.size() < n; ++i) {         int num = k * i;         arr.push_back(num);         sum += num;     }

    // 返回数组元素之和     return sum; }

int main() {     std::cout << (solution(3, 1) == 6) << std::endl;     std::cout << (solution(2, 2) == 6) << std::endl;     std::cout << (solution(4, 3) == 30) << std::endl; }

一、思路剖析

本题旨在构造特定要求的数组并求其元素和最小值,核心思路围绕最大公约数与和最小化展开。既然数组所有元素最大公约数为  k ,那元素均可写成  k  乘以某整数形式。为保证元素两两不同且总和最小,从  k  起依次取不同倍数构建数组。如  k = 1 、 n = 3  时,选  1×1 、 1×2 、 1×3 ,对应  1 、 2 、 3 ,和为  6 ;当  k = 3 、 n = 4  是选  3×1 、 3×2 、 3×3 、 3×4 ,即  3 、 6 、 9 、 12 ,和是  30 ,巧妙契合测试样例结果,利用自然数序列倍数来满足条件。

二、代码详解

1. 函数声明与初始化: int solution(int n, int k)  定义函数接收元素个数  n  和最大公约数  k ,在函数内部,先对非法输入( k <= 0 )排除,直接返回  0 ,确保后续计算基于合理数据。接着定义  sum  存总和并初始为  0 , vector arr  用于存放构造出的数组元素。 2. 数组构建与求和循环: for (int i = 1; arr.size() < n; ++i)  循环是关键,从  i = 1  起,每次生成  k * i  作为新元素, arr.push_back(num)  将新元素存入数组,同时  sum += num  累加进总和,循环持续到数组  arr  元素个数达  n  个,以此按从小到大顺序选  k  的倍数填充数组并求和。 3. 返回结果:循环结束, return sum  将计算好的满足条件数组元素总和最小值返回,完成核心功能。 4. 主函数验证: main  函数里通过  std::cout << (solution(3, 1) == 6) << std::endl  等语句,将函数计算结果与预期样例结果对比输出(输出  1  代表相等正确, 0  代表错误),验证  solution  函数在不同输入下准确性。

三、知识点总结

1. 数论基础:最大公约数概念贯穿始终,理解数组元素与  k  的倍数关系基于此,反映数论在算法编程里构建规则、满足条件的运用,数论为程序逻辑奠基,把控数组元素内在数学联系。 2. 数组与容器操作: vector  容器灵活管理动态数组, push_back  便捷添加元素,按条件逐个添加  k  倍数构建目标数组,展示 C++标准模板库容器处理可变长数据结构优势,数组构建、存取、扩容知识融合运用。 3. 循环与逻辑控制: for  循环按步长取  k  倍数,依  arr.size() < n  控制循环次数,精准把控数组规模,体现编程里循环按条件迭代生成有序数据序列技巧,是实现复杂逻辑、达成程序目标的常用手段。 4. 函数封装与测试: solution  函数封装核心算法,参数传入、结果返回条理清晰, main  函数测试将预期结果与实际对比,凸显模块化编程与测试驱动开发思维,助于代码功能验证、错误排查,提升程序可靠性、可读性。