二、数组元素之和最小化 问题描述 小C希望构造一个包含n个元素的数组,且满足以下条件:
数组中的所有元素两两不同。 数组所有元素的最大公约数为 k。 数组元素之和尽可能小。 任务是输出该数组元素之和的最小值。 数组中的所有元素两两不同。 数组所有元素的最大公约数为 k。 数组元素之和尽可能小。 任务是输出该数组元素之和的最小值。
测试样例 样例1:
输入:n = 3 ,k = 1 输出:6
样例2:
输入:n = 2 ,k = 2 输出:6
样例3:
输入:n = 4 ,k = 3 输出:30
解题思路: 理解最大公约数为 k 的含义:
数组中的每个元素都必须是 k 的倍数。 为了满足数组元素两两不同,我们可以从 k 的倍数中选择不同的数。 选择最小的 n 个不同的 k 的倍数:
关键点
- 商品频率统计:使用哈希表(如
map或unordered_map)来统计商品的出现次数。 - 顾客需求统计:同样使用哈希表来统计顾客的需求。
- 匹配计算:通过比较货架上商品的数量和顾客的需求数量,计算出最大匹配数。
最小的 n 个不同的 k 的倍数是 k, 2k, 3k, ..., nk。 这些数的和为 k + 2k + 3k + ... + nk,可以简化为 k * (1 + 2 + 3 + ... + n)。 计算和的最小值:
根据等差数列求和公式,1 + 2123 + 3 123+ .123.. 123+ n 的和为 n * (n + 1) / 2。 因此,数组元素之和的最小值为 k * n * (n + 1) / 2。 解题思路: 理解最大公约数为 k 的含义:
数组中的每个元素都必须是 k 的倍数。 为了满足数组元素两两不同,我们可以从 k 的倍数中选择不同的数。 选择最小的 n 个不同的 k 的倍数:
最小的 n 个不同的 k 的倍数是 k, 2k, 3k, ..., nk。 这些数的1和为 k + 2k + 3k + ... + nk,可以简化为 k * (1 + 2 + 3 + ... + n)。 计算和的2最小值:
根据等差数1列求和公式,1 + 2 + 3 + ... + n 的和为 n * (n + 1) / 2。 因此,数组元素之和的最小值为 k * n * (n + 1) / 2。 最终代码:
#include <iostream>
#include <vector>
#include <string>
using namespace std;
int solution(int n, int k) {
int sum = 0;
for(int i = 1 ; i <= n ; i ++)
sum += k * i;
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;
}