Задача A305
Условие задачи
Даны действительные числа [latex]a_{1},\dots,a_{n}[/latex]. Оставить без изменения последовательность [latex]a_{1},\dots,a_{n}[/latex], если она упорядочена по неубыванию или по невозрастанию; в противном случае удалить из последовательности те члены, порядковые номера которых кратны четырём, сохранив прежним порядок оставленных членов.
Тестирование
№ | Входные данные | Выходные данные |
1. | 5 -1 2 3 4 5 |
-1 2 3 4 5 |
2. | 6 6 0 2 3 4 6.7 |
0 2 3 6.7 |
3. | 10 1 2 5 7 -10 3 1 3 2 1 |
2 5 7 3 1 3 1 |
4. | 5 1 5 6 7.5 0 |
5 6 7.5 |
5. | 3 -23 46 -80 |
46 -80 |
Реализация
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 |
#include <iostream> #include <vector> #include <iterator> using namespace std; int main() { int size_of_the_sequence; int temp = 0; //счетчик cin >> size_of_the_sequence; vector<double> v1 (size_of_the_sequence); vector<double> v2; bool h = true, l = true; for (int i = 0; i < size_of_the_sequence; i++) { cin >> v1[i]; if (i % 4 == 0) temp++; } for (int i = 1; i < size_of_the_sequence; i++) { if (v1[i - 1] <= v1[i]) { l = false; } if (v1[i - 1] >= v1[i]) { h = false; } } if (!l && !h)//исходная последовательность не упорядочена ни по возрастанию, ни по убыванию { v2.resize(size_of_the_sequence - temp); int size_of_the_sequence = 0; for (int i = 0; i < v1.size(); i++) { if (i % 4 == 0) { size_of_the_sequence++; continue; } else v2[i - size_of_the_sequence] = v1[i]; } v1.resize(size_of_the_sequence - temp); v1 = v2; v1.shrink_to_fit(); v2.clear(); } copy(v1.begin(), v1.end(), ostream_iterator<double>(cout, " "));//выводим исходную последовательность без изменений return 0; } |
Алгоритм решения
Считываем все действительные числа до конца входного потока и записываем их в вектор
v1. Проверяем, упорядочена ли последовательность по возрастанию или по убыванию. Если да, выводим на экран исходную последовательность без изменений с помощью функции
copy() и итератора вывода
ostream_iterator, который записывает элементы последовательно в выходной поток. Если же последовательность не упорядочена ни по убыванию, ни по возрастанию, удаляем из неё элементы, порядковые номера которых кратны четырём. Важно сохранить прежним порядок оставленных членов.
Работаем следующим образом:
1. Создаём вектор
v_2.
2. Уменьшаем размер контейнера с помощью функции
resize():
v2.resize(size_of_the_sequence - temp). Инициализируем переменную
size_of_the_sequence значением ноль.
3. Если порядковый номер элемента неупорядоченной последовательности кратен четырём, то увеличиваем количество элементов на единицу с каждой итерацией. Иначе, присваиваем вектору
v_2 значение вектора
v_1:
v2[i - size_of_the_sequence] = v1[i].
4. Уменьшаем размер контейнера
v_1. Присваиваем вектору
v_1 значение вектора
v_2.
5. С помощью функции
shrink_to_fit() уменьшаем количество используемой памяти вектора
v_1.
6. Извлекаем все элементы из вектора
v_2 с помощью функции
clear().
Для запроса на выполнение следует перейти по ссылке.