Найти максимальный непрерывный фрагмент суммы элементов, делящейся на три в массиве a1,a2...aN. Введено число N≤100000

Найти максимальный непрерывный фрагмент суммы элементов, делящейся на три в массиве a1,a2...aN. Введено число N≤100000 и N чисел, не превышающих по модулю 10^9. Вывести индексы начала и конца фрагмента. Если есть несколько фрагментов, вывести тот, у которого начальный индекс минимальный. В противном случае, вывести -1. Пример ввода: 5 1 2 3 4 5. Пример вывода: 1 5. Код: #include #include
Галина_4391

Галина_4391

Для решения данной задачи, мы можем использовать два указателя - начальный и конечный, для определения фрагмента с максимальной суммой элементов, делящейся на три.

Давайте разберемся, как мы можем выполнять шаги поиска максимального непрерывного фрагмента суммы элементов, делящихся на три:

1. Вводим необходимые переменные:
- Число N, ограничивающее количество элементов в массиве.
- Массив a, содержащий N чисел.

2. Инициализируем переменные:
- Сумму текущего фрагмента max_sum, равную 0.
- Индекс начала фрагмента max_start, равный 0.
- Индекс конца фрагмента max_end, равный 0.
- Сумму текущего фрагмента current_sum, равную 0.
- Индекс текущего элемента current_index, равный 0.

3. Выполняем цикл от 0 до N:
- Увеличиваем сумму текущего фрагмента current_sum на значение текущего элемента a[current_index].
- Если current_sum делится на 3 без остатка:
- Если current_sum больше max_sum:
- Обновляем max_sum с текущим значением current_sum.
- Обновляем max_start с текущим значением current_index.
- Обновляем max_end с текущим значением current_index.
- Иначе, если current_sum равно max_sum, и текущий фрагмент имеет меньший индекс начала:
- Обновляем max_start с текущим значением current_index.
- Обновляем max_end с текущим значением current_index.
- Если current_sum не делится на 3 без остатка:
- Если current_sum равно 0, и текущий фрагмент не содержит элементов:
- Обновляем max_start и max_end с текущим значением current_index.
- Иначе, если current_sum равно max_sum, и текущий фрагмент имеет меньший индекс начала:
- Обновляем max_start с текущим значением current_index.

4. Печатаем индексы начала и конца фрагмента, если max_sum больше 0. В противном случае, печатаем -1.

Используемый код на языке C++:

cpp
#include

int main() {
int N;
std::cin >> N;

int a[100000];
for (int i = 0; i < N; i++) {
std::cin >> a[i];
}

int max_sum = 0;
int max_start = 0;
int max_end = 0;
int current_sum = 0;
int current_index = 0;

for (int i = 0; i < N; i++) {
current_sum += a[current_index];

if (current_sum % 3 == 0) {
if (current_sum > max_sum) {
max_sum = current_sum;
max_start = current_index;
max_end = current_index;
} else if (current_sum == max_sum && current_index < max_start) {
max_start = current_index;
max_end = current_index;
}
} else {
if (current_sum == 0) {
max_start = current_index;
max_end = current_index;
} else if (current_sum == max_sum && current_index < max_start) {
max_start = current_index;
max_end = current_index;
}
}

current_index++;
}

if (max_sum > 0) {
std::cout << max_start + 1 << " " << max_end + 1 << std::endl;
} else {
std::cout << -1 << std::endl;
}

return 0;
}


Этот код решает задачу, вводя число N и массив a из N элементов, и затем находя фрагмент с максимальной суммой элементов, делящейся на три, и выводит его индексы начала и конца. Если такого фрагмента не существует, выводится -1.

Надеюсь, данное объяснение поможет вам понять решение задачи! Если у вас возникнут еще вопросы, пожалуйста, не стесняйтесь задавать.
Знаешь ответ?
Задать вопрос
Привет!
hello