У меня есть структура данных (круговой двусвязный список) из N целых чисел.Я должен изменить это, минимизируя некоторое количество.В некоторых случаях расположения чисел мне придется проверять, минимизировано ли количество, проверяя измененную структуру данных в двух или более случаях.Я хотел бы знать, достаточно ли хороша моя попытка и есть ли лучший алгоритм для этих случаев.Я не формулирую проблему в явном виде, поскольку я хотел бы решить ее самостоятельно, но для отладки мы должны взять два смежных элемента списка, которые имеют минимальную сумму, и заменить их на сумму.Мы должны рассчитать сумму сумм на каждом этапе.(От N до 1)
Я создал две функции, две функции: mod () и demod (), чтобы изменять и демодифицировать список.В этих случаях я буду модифицировать структуру () для случая 1 и сохранить количество 1, demod (), затем модифицировать ее для случая 2 и сохранить количество 2.Затем я выберу мод () для этого случая, который имеет наименьшее количество.index и temp - два указателя, где я должен оценить количество.Отредактированный код приведен ниже.
struct Node {
long long int data;
struct Node * prev;
struct Node * next;
};
void mod(struct Node * index, long long int val) {
struct Node * temp1 = index -> next;
index -> data = val;
index -> next = (index -> next) -> next;
((index -> next) -> next) -> prev = index;
//free(temp1);
}
void demod(struct Node * index ,long long int a){
long long int b = index->data - a;
index->data = a;
struct Node * new_Node = new Node;
new_Node->data = b;
new_Node -> next = index -> next;
index->next = new_Node;
new_Node->prev = index;
(new_Node->next)->prev = new_Node;
}
long long int value(struct Node * start, int length) {
long long int val;
struct Node * index = start->prev;
val = f(start -> prev);
struct Node * temp = start;
while (temp -> next != start) {
if (val > f(temp)) {
index = temp;
val = f(temp);
}
temp = temp -> next;
}
cout << "val : " << val << "--";
temp = start;
while (temp -> next != start) {
if (f(temp)==val && (index -> next == temp)) {
std::cout << "*##";
long long int init1 = index -> data;
//displayList(start);
// cout << init1 << " ";
mod(index, val, start);
cout << "start case 1\n ";
long long int temp1 = solve(start, length - 1);
cout << "end case 1\n ";
demod(index, init1);
displayList(start);
mod(temp, val, start);
displayList(start);
cout << "start case 2 \n";
long long int temp2 = solve(start, length - 1);
cout << "end case 2\n";
if (temp1 > temp2) {
mod(temp, val, start);
return val;
} else {
mod(index, val, start);
return val;
}
/*if ((index -> prev) -> data > ((temp -> next) -> next) -> data) {
std::cout << "*";
index = index -> next;
}*/
}
temp = temp -> next;
}
// cout << "index data " << index -> data << "\n";
mod(index, val, start);
return val;
}
... Полный код (162 строки) https://drive.google.com/open?id=1oD1pEr3_seX6kIzErpRG-Xu3s_95UVBj В коде теперь есть несколько угловых случаев, которые мне нужно исправить, и у меня возникла основная проблема использования структуры данных снова и снова.