gpt4 book ai didi

c++ - 组最高值的最小可能总和

转载 作者:太空狗 更新时间:2023-10-29 23:13:20 25 4
gpt4 key购买 nike

<分区>

我有一个未排序的随机正整数数组。 (例如 {42, 68, 35, 1, 70, 25, 79, 59, 63, 65} )

我想把这个数组分成更小的组。原数组中相邻的2个数,不能在同一组。 (例如 42 和 68 必须在不同的组中)

每组最大数之和,应该越小越好。 (例如,{42, 68, 35, 1, 70, 25, 79, 59, 63, 65} 的最佳组为 {79, 70, 68, 63}, {65, 59, 42, 35, 25} , {1}, 总和为 79 + 65 + 1 = 145.

我当前的算法将值与索引配对,按值的降序对数组进行排序,遍历数组,检查是否在组 1 中找到相邻索引,如果没有,则插入值,否则进入下一个群等

//std::vector<std::vector<int>> groups;
//std::vector<std::pair<int, int>> pairs; Sorted by first element (value)
//for each value in the array
for (int j = 0; j < n; j++)
{
bool notfound = false;
//for each group
for (int z = 0; z < groups.size(); z++)
{
//Check if the group doesn't have a value with index +/- 1 of current
if ( std::find(groups[z].begin(),groups[z].end(), pairs[j].second + 1) == groups[z].end()
&& std::find(groups[z].begin(), groups[z].end(), pairs[j].second - 1) == groups[z].end())
{
//if not found in the group, add it
groups[z].push_back(pairs[j].second);
notfound = true;
break;
}
}
//If found, create new group and add there
if (!notfound)
{
//First value of group is always it's biggest since
//we use array sorted by value, so the first number can be
//added to the sum
totalSum += pairs[j].first;
groups.push_back(std::vector<int>{pairs[j].second});
}
}

我知道它有点乱。但是代码的问题是,它并不是每次都给出最佳总和。 (例如,对于上面的示例数组,此代码将为您提供组 {79, 70, 68, 65}, {63, 42, 35, 25}, {59, 1},总和为 79 + 63 + 59 = 201 > 145)

编辑:
该算法无法按我需要的方式工作。我正在寻找解决此问题的替代方法或对当前算法的修改,该算法考虑了我没有考虑的问题部分。

数组中可能有多个相同数字的实例,所以我认为 std::set 行不通。

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com