Member 13062680 Ответов: 1

Как я могу разделить круговой массив на k групп смежных элементов таким образом, чтобы разница между максимальной суммой и минимальной суммой была минимальной.


Как я могу разделить круговой массив на k групп смежных элементов таким образом, чтобы разница между максимальной суммой и минимальной суммой была минимальной. Каждая группа имеет непрерывный элемент массива.
Например, если массив выглядит следующим образом.
[6 13 10 2] и k=2, то o/p должно быть 18(6+10+2)-13=5. Поскольку массив является круговым, 6,10,2 являются смежными элементами массива.

Например, если массив выглядит следующим образом.
[6 13 2 10] и k=2, то o/p должно быть 16(6+10)-15(13+2)=1. Поскольку массив является круговым, 6,10 являются смежными элементами массива.

Например, если массив выглядит следующим образом.
[100 92 133 201 34 34 34 94 108] и k=4, то группируйте следующим образом 208(108,100), 225(92,133), (201), 196(34,34,34,94) Итак, 225-196=29

Что я уже пробовал:

Ниже приводится грубое силовое решение этого вопроса. Как я могу это оптимизировать?
//#define MAX_POINT 6
#define ARR_SIZE 100
//#define K 4
#include <limits>
#include<stdio.h>
#include<iostream>
using namespace std;

int ai[]={6,13,2,10};


/* Utility function to print array arr[] */
void printArray(int arr[], int arr_size);

int finddifference(int a[], int sizeai, int g){
	int min = 16000;
	for(int i=0;i<sizeai;i++){
		int j=0,k=i;
		int min_g=16000;
		int max_g=-16000;
		int sum=0;
		while(j<g){
			int temp=a[j];
			while(temp){

				sum+=ai[k];
				k=(k+1)%sizeai;
				temp--;
			}
			if(sum<min_g)
				min_g=sum;
			if(sum>max_g)
				max_g=sum;
			sum=0;
			j++;
		}

		if((max_g-min_g)<min)
			min=max_g-min_g;
	}
	return min;
}

/* The function prints all combinations of numbers 1, 2, ...MAX_POINT
that sum up to n.
i is used in recursion keep track of index in arr[] where next
element is to be added. Initital value of i must be passed as 0 */
void printCompositions(int n, int i, int max_point, int g, int *min)
{

	/* array must be static as we want to keep track
	of values stored in arr[] using current calls of
	printCompositions() in function call stack*/
	static int arr[ARR_SIZE];

	if (n == 0 && i==g)
	{
		int temp_min = finddifference(arr, max_point+g-1, g);
		*min = (temp_min<*min)?temp_min:*min;
		//printArray(arr,i);
	}
	else if(n > 0)
	{
		int k;
		for (k = 1; k <= max_point; k++)
		{
			arr[i]= k;
			printCompositions(n-k, i+1, max_point, g, min);
		}
	}
}

/* UTILITY FUNCTIONS */
/* Utility function to print array arr[] */
void printArray(int arr[], int arr_size)
{
	int i;
	for (i = 0; i < arr_size; i++)
		printf("%d ", arr[i]);
	printf("\n");
}

/* Driver function to test above functions */
int main()
{
	int n, g;
	cin>>n;
	cin>>g;
	int max_point=n-g+1;
	int min = 16000;
	printCompositions(n, 0, max_point,g,&min);
	cout<<"Answer"<<min<<endl;
	getchar();
	return 0;
}

1 Ответов

Рейтинг:
2

Patrice T

Цитата:
Кроме этого, никаких идей.

Поскольку вы не знаете никакого умного алгоритма для решения этой проблемы, ответ таков атака грубой силы- Испробуйте все возможности.
Вопрос: Каково ограничение на размер каждой группы "k"?
в '[6 13 2 10] и k=2 ' каждая группа имеет размер 2 или вы можете иметь 1 и 3 ?
Цитата:
Попытался решить, создав массив и элемент массива - это сумма элементов массива до элемента i. Кроме этого, никаких идей.

вы не описываете здесь никаких проблем. Ваш массив смутно связан с оптимизацией, но не с решением проблем.
Шаг 1: Придумайте алгоритм, который работает, подумайте, как вы это делаете с листом бумаги и карандашом.
Шаг 2: как только это сработает, подумайте об оптимизации.

Чтобы получить реальную помощь здесь, вернитесь со своим кодом и конкретной проблемой.

Мы не делаем вашу домашнюю работу.
Домашнее задание предназначено не для того, чтобы проверить ваши навыки просить других людей выполнять вашу работу, а для того, чтобы заставить вас думать и помочь вашему учителю проверить ваше понимание пройденных вами курсов, а также проблем, возникающих при их применении.
Любая ваша неудача поможет учителю выявить ваши слабости и наметить меры по их исправлению.
Любая ваша неудача поможет вам узнать, что работает, а что нет, это называется "методом проб и ошибок".
Так что попробуйте, перечитайте свои уроки и начинайте работать. Если вы застряли на конкретной проблеме, покажите свой код и объясните эту точную проблему, мы можем помочь.

Как программист, ваша задача-создавать алгоритмы это решает конкретные проблемы, и вы не можете полагаться на кого-то другого, чтобы вечно делать это за вас, поэтому есть время, когда вам придется научиться этому. И чем скорее, тем лучше.
Когда вы просто просите решение, это все равно что пытаться научиться водить машину, обучая кого-то другого.
Создание алгоритма-это в основном поиск математики и необходимая адаптация к вашей реальной задаче.

Идея "развития" заключается в том, что это слово предполагает: "систематическое использование научно-технических знаний для достижения конкретных целей или требований." BusinessDictionary.com[^]
Это не то же самое, что "быстро гуглите и сдавайтесь, если я не могу найти точно правильный код".


Member 13062680

k=2. означает, что размер группы может быть любым, но количество групп должно быть 2.

Member 13062680

Ниже приводится грубое силовое решение этого вопроса. Как я могу это оптимизировать?
//#определить MAX_POINT 6
#определить ARR_SIZE 100
//#определить K 4
#включить & lt;лимиты>
#include< stdio.h>
#include<iostream>
использование пространства имен std;

инт Ма[]={6,13,2,10};


/ * Служебная функция для печати массива arr[] */
void printArray(int arr [], int arr_size);

int finddifference(int a [], int sizeai, int g){
int min = 16000;
for (int i=0;i< sizeai; i++){
int j=0, k=i;
инт min_g=16000;
инт max_g=-16000;
int sum=0;
а(Дж&л;г){
int temp=a[j];
в то время как (temp){

сумма+=ai[k];
k=(k+1)%sizeai;
температура--;
}
если(сумма&ЛТ;min_g)
min_g=сумма;
if (sum> max_g)
max_g=сумма;
сумма=0;
Дж++;
}

если((max_g-min_g)&ЛТ;мин)
мин=max_g-min_g;
}
возврат мин;
}

/ * Функция печатает все комбинации чисел 1, 2,...MAX_POINT
эта сумма сводится к n.
i используется в рекурсии keep track of index in arr[] where next
элемент должен быть добавлен. Начальное значение i должно быть передано как 0 */
пустота printCompositions(инт н я инт, инт max_point, г инт, инт *мин)
{

/ * массив должен быть статичным, так как мы хотим отслеживать
значений, хранящихся в arr[] с использованием текущих вызовов
printCompositions() в стеке вызовов функций*/
static int arr[ARR_SIZE];

если (n == 0 & & amp; i==g)
{
int temp_min = finddifference(arr, max_point+g-1, g);
*мин = (temp_min&ЛТ;*мин)?temp_min:*мин;
//printArray(arr, i);
}
иначе если(n > 0)
{
текст;
for (k = 1; k <= max_point; k++)
{
arr[i]= k;
printCompositions(n-k, i+1, max_point, g, min);
}
}
}

/* ФУНКЦИЯ ПОЛЕЗНОСТИ */
/ * Служебная функция для печати массива arr[] */
void printArray(int arr [], int arr_size)
{
int i;
for (i = 0; i < arr_size; i++)
printf ("%d", arr[i]);
printf ("\n");
}

/ * Функция водителя для проверки вышеуказанных функций */
тап_п()
{
int n, g;
cin>> n;
cin>> g;
int max_point=n-g+1;
int min = 16000;
printCompositions(n, 0, max_point, g,& min);
соиь<&ЛТ;"ответ",&ЛТ;&ЛТ;мин&ЛТ;<епси;
функция getchar();
возвращает 0;
}

Patrice T

Улучшите свой вопрос с помощью этого кода, и у вас будет больше шансов получить помощь.

Воспользуйся Улучшить вопрос чтобы обновить ваш вопрос.
Чтобы каждый мог обратить внимание на эту информацию.

CPallini

5.

Patrice T

Спасибо

Member 13062680

Что?