Как разделить элементы в массиве на минимальное количество массивов, чтобы разница между значениями элементов каждого из сформированных массивов не отличалась более чем на 1?
* 1004Допустим, у нас есть массив:
[4, 6, 8, 9, 10, 11, 14, 16, 17]
.Элементы массива отсортированы.
Я хочу разделить элементы массива на минимальное количество массивов, чтобы каждый из элементов в результирующих массивах не отличался более чем на 1.
В этом случае группировки будут: [4], [6], [8, 9, 10, 11], [14], [16, 17]
.Таким образом, было бы всего 5 групп.
Как я могу написать программу для того же самого?Или вы можете также предложить алгоритмы.
Я попробовал наивный подход: получить разницу между последовательными элементами массива и, если разница меньше (или равна) 1, я добавляю эти элементы в новыйвектор.Однако этот метод очень неоптимизирован , и при прямом наборе не отображаются результаты для большого количества входов.
Реальная реализация кода:
#include<cstdio>
#include<iostream>
#include<vector>
using namespace std;
int main() {
int num = 0, buff = 0, min_groups = 1; // min_groups should start from 1 to take into account the grouping of the starting array element(s)
cout << "Enter the number of elements in the array: " << endl;
cin >> num;
vector<int> ungrouped;
cout << "Please enter the elements of the array: " << endl;
for (int i = 0; i < num; i++)
{
cin >> buff;
ungrouped.push_back(buff);
}
for (int i = 1; i < ungrouped.size(); i++)
{
if ((ungrouped[i] - ungrouped[i - 1]) > 1)
{
min_groups++;
}
}
cout << "The elements of entered vector can be split into " << min_groups << " groups." << endl;
return 0;
}