Примеры решения задач
Решим задачу. Прочтите условие задачи по ссылке.
Анализ условия
Переформулируем условие :
Дан массив. Вы несколько раз (возможно ноль) выбираете два разных индекса и таких, что , и удаляете наименьший элемент из этих двух (если они равны то удаляете любой). Определите возможно ли получить массив, состоящий только из одного элемента. (
YES/NO)
Алгоритм
-
"На какую тему задача?". Данная задача взята не из конкретной лабы, но вчитаемся чуть внимательнее в условие. Учитывая, что мы удаляем из двух выбранных элементов минимальный, то логичным будет утверждение о том, что если ответ
YES, то наш оставшийся элемент - максимальный. Так мы пришли к тому, что задача, вероятнее всего, будет связана с сортировкой. -
Время определить, как именно нам поможет сортировка, и какой алгоритм мы должны выстроить вокруг неё. Для этого достаточно рассмотреть последнее удаление — мы выбрали и , где . Следовательно максимальный элемент массива невозможно удалить, а так-же или . Из всего вышеперечисленного можно сделать вывод, что при оптимальном процессе удаления, числа, которые удаляются, не уменьшаются. Значит решение заключается в том, чтобы отсортировать массив и сравнить на разность соседние элементы.
-
Реализуем поэтапно наше решение, в ходе чего будем анализировать каждый шаг и возможность его оптимизации.
-
Протестируем наше решение готовыми тестами из условия, а также напишем несколько своих тестов, задумавшись о ситуациях, где входные данные могут иметь нерядовой случай, который мы могли не учесть, и который сломает наше решение.
Пункт (4) остаётся на размышление читателям.
Решение формально выглядит так :
- считать массив
- отсортировать его
- сравнить соседние элементы. И если где-то разница элементов больше единицы, то ответ
NO, иначеYES.
Введите код из листинга ниже в файл main.cpp.
#include <iostream>
using namespace std;
int a[50];
void solve() {
int n;
cin >> n;
for (int i = 0; i < n; i++) {
cin >> a[i];
}
sort(a, a + n);
for (int i = 0; i + 1 < n; i++) {
if (a[i + 1] - a[i] > 1) {
cout << "NO\n";
return;
}
}
cout << "YES\n";
}
int main() {
int t;
cin >> t;
while (t--) {
solve();
}
return 0;
}
Этот код содержит много информации, поэтому рассмотрим его построчно.
Для ввода данных и последующей печати ответов нам необходимо подключить библиотеку iostream. Для этого напишем #include <iostream>, а using namespace std; помогает использовать пространство имён. (не берите в голову)
Функция main запускается каждый раз при запуске программы. Ещё main называют точкой входа в программу. Функция ничего не принимает, поэтому мы написали (). Тело любой функции заключается в {}. Перед main написано int — тип результата функции, возвращаем мы 0 (return 0). Именно 0, так-как это код возврата программы и чтобы не получить RE он должен быть 0.
Как видно solve тоже функция, но тип перед ней void — пустой тип, поэтому мы и делаем return ;.
Типы данных
В c++, как и во всех языках программирования много типов данных. int/float/string и тп.
В задаче нам нужны типы для длины массива и количество тестов t. Для таких переменных подходят числа, а их тип int, от слова Integer.
Массив чисел создаётся в формате тип НазваниеПеременной[КоличествоЭлементов]
Ввод и вывод данных
Данные можно вводить и выводить различными способами, но самое простое это использовать стандартные потоки.
Так как ввод посимвольная операция, то cin >> t; попробует считывать символы до пробела, и запишет число в t, так как переменная t типа int. (>> оператор, который лишь перегружен для ввода из потока)
Например, cout << "YES\n"; — выведет три символа Y E S, а затем выведет \n — символ новой строки.
Сортировка и циклы
Сортировка это лишь стандартная функция. Для сортировки по не убыванию достаточно передать в качестве аргументов два указателя на память, на начало и конец. Если проще, то просто a и a+n.
for и while — циклы.
Последние штрихи
Я написал отдельную функцию solve и запустил её t раз (только красиво).
Условие в цикле для сравнения соседних элементов я написал i + 1 < n, чтобы не было RE, при чтение ненужной памяти. Собственно если разница больше единицы, то я моментально прекращаю работу функции используя return ;.
Следовательно если ответ на задачу должен быть YES, то после выполнения цикла выведется корректный ответ.
Очень многое опущено — поэтому углубитесь в язык программирования c++ и задавайте вопросы)))