Варианты ЛР 3
Ниже приведены варианты лабораторной работы ЛР 3 «Структуры, линейные списки и
динамическая память». Basic — односвязный список Student; advanced — двусвязный;
high — кольцевой список Value (enum + union). Все варианты читают input.txt
и пишут результат в output.txt.
Варианты основной группы
Вариант 1. Разделение по score >= 4.5
Стабильно переставить записи: сначала все с score >= 4.5, затем остальные. Порядок внутри групп сохранить.
Пример ввода:
4
1 1 4.80
2 2 3.20
3 3 4.00
4 1 4.60
Пример вывода:
1 1 4.80
4 1 4.60
2 2 3.20
3 3 4.00
Вариант 2. Неуспевающие в конец
Стабильно переставить записи: сначала все с score >= 3.0, затем неуспевающие (score < 3.0).
Пример ввода:
4
1 1 4.00
2 2 2.50
3 3 3.80
4 1 2.90
Пример вывода:
1 1 4.00
3 3 3.80
2 2 2.50
4 1 2.90
Вариант 3. Чётные курсы в начало
Стабильно переставить записи: сначала чётные курсы, затем нечётные.
Пример ввода:
4
1 1 4.00
2 2 3.50
3 3 4.90
4 4 3.80
Пример вывода:
2 2 3.50
4 4 3.80
1 1 4.00
3 3 4.90
Вариант 4. Удаление записей ниже порога
Удалить все записи с score < T. Запись ровно с T остаётся. Порядок оставшихся сохранить. T вводится после списка.
Пример ввода:
4
1 1 4.00
2 2 3.20
3 3 3.50
4 1 2.80
3.5
Пример вывода:
1 1 4.00
3 3 3.50
Вариант 5. Выше среднего — в начало
Вычислить средний score. Стабильно переставить записи: сначала те, у кого score >= среднего, затем остальные.
Пример ввода:
4
1 1 4.00
2 2 2.00
3 3 5.00
4 1 3.00
Пример вывода:
1 1 4.00
3 3 5.00
2 2 2.00
4 1 3.00
Вариант 6. Только заданный курс
Оставить только записи с course == K, где 1 <= K <= 6. Порядок сохранить. K вводится после списка.
Пример ввода:
4
1 1 4.00
2 2 3.50
3 2 4.90
4 3 3.80
2
Пример вывода:
2 2 3.50
3 2 4.90
Вариант 7. Удалить минимальные score
Найти минимальный score и удалить все записи с этим значением. Порядок оставшихся сохранить.
Пример ввода:
5
1 1 4.00
2 2 2.50
3 3 3.80
4 1 2.50
5 2 4.10
Пример вывода:
1 1 4.00
3 3 3.80
5 2 4.10
Вариант 8. Группы курсов 1–2, 3–4, 5–6
Стабильно переставить записи: сначала курсы 1–2, затем 3–4, затем 5–6.
Пример ввода:
5
1 3 3.00
2 1 4.00
3 5 2.50
4 2 3.50
5 4 4.50
Пример вывода:
2 1 4.00
4 2 3.50
1 3 3.00
5 4 4.50
3 5 2.50
Вариант 9. Развернуть вторую половину
Разделить список на две половины и развернуть вторую. При нечётном N средний элемент остаётся в конце первой половины.
Пример ввода:
5
1 1 4.00
2 2 3.50
3 3 4.90
4 4 3.80
5 5 4.10
Пример вывода:
1 1 4.00
2 2 3.50
3 3 4.90
5 5 4.10
4 4 3.80
Вариант 10. Поменять половины местами
Разделить список на две половины и поменять их местами. При нечётном N средний элемент остаётся в конце первой половины.
Пример ввода:
6
1 1 4.00
2 2 3.50
3 3 4.90
4 4 3.80
5 5 4.10
6 6 3.20
Пример вывода:
4 4 3.80
5 5 4.10
6 6 3.20
1 1 4.00
2 2 3.50
3 3 4.90
Вариант 11. Циклический сдвиг на K
Циклически сдвинуть список на K позиций вправо. 0 <= K <= N; при K = 0 или K = N список не меняется. K вводится после списка.
Пример ввода:
5
1 1 4.50
2 2 3.80
3 3 4.90
4 1 4.10
5 2 3.50
2
Пример вывода:
4 1 4.10
5 2 3.50
1 1 4.50
2 2 3.80
3 3 4.90
Вариант 12. Развернуть блоки по K
Развернуть каждый блок длины K (последний блок может быть короче). 1 <= K <= N. K вводится после списка.
Пример ввода:
5
1 1 4.00
2 2 3.50
3 3 4.90
4 4 3.80
5 5 4.10
2
Пример вывода:
2 2 3.50
1 1 4.00
4 4 3.80
3 3 4.90
5 5 4.10
Вариант 13. Развернуть суффикс после K
Оставить первые K элементов, а суффикс после них развернуть. 0 <= K <= N. K вводится после списка.
Пример ввода:
5
1 1 4.00
2 2 3.50
3 3 4.90
4 4 3.80
5 5 4.10
2
Пример вывода:
1 1 4.00
2 2 3.50
5 5 4.10
4 4 3.80
3 3 4.90
Вариант 14. Нечётные позиции, затем чётные
Стабильно переставить записи: сначала элементы на нечётных позициях (1, 3, 5, …), затем на чётных (2, 4, 6, …).
Пример ввода:
5
1 1 4.00
2 2 3.50
3 3 4.90
4 4 3.80
5 5 4.10
Пример вывода:
1 1 4.00
3 3 4.90
5 5 4.10
2 2 3.50
4 4 3.80
Вариант 15. Поменять соседние пары
Поменять местами каждые два соседних узла. При нечётном N последний узел остаётся на месте.
Пример ввода:
5
1 1 4.00
2 2 3.50
3 3 4.90
4 4 3.80
5 5 4.10
Пример вывода:
2 2 3.50
1 1 4.00
4 4 3.80
3 3 4.90
5 5 4.10
Вариант 16. Максимум в начало
Переставить запись с максимальным score в начало, сохранив порядок остальных. При нескольких максимумах берётся первый.
Пример ввода:
5
1 1 4.00
2 2 3.50
3 3 4.90
4 4 3.80
5 5 4.10
Пример вывода:
3 3 4.90
1 1 4.00
2 2 3.50
4 4 3.80
5 5 4.10
Вариант 17. Чередующееся слияние
Слить два списка, чередуя элементы. Если длины разные, остаток более длинного добавляется в конец.
Пример ввода:
3
10 1 4.00
30 3 4.90
50 5 4.10
2
20 2 3.50
40 4 3.80
Пример вывода:
10 1 4.00
20 2 3.50
30 3 4.90
40 4 3.80
50 5 4.10
Вариант 18. Слияние по порогу
Из первого списка взять записи с score >= T, из второго — с score < T. Сохранить порядок внутри каждой части. T вводится после второго списка.
Пример ввода:
3
1 1 4.50
2 2 3.20
3 3 5.00
2
4 4 3.90
5 5 4.20
4.0
Пример вывода:
1 1 4.50
3 3 5.00
4 4 3.90
Вариант 19. Слияние с дедупликацией
Слить два списка, отсортированных по id. При совпадении id оставить запись с большим score, при равенстве — первую. Результат — по возрастанию id.
Пример ввода:
3
1 1 4.00
3 2 4.50
5 3 3.00
3
2 1 3.50
3 2 4.90
6 3 4.10
Пример вывода:
1 1 4.00
2 1 3.50
3 2 4.90
5 3 3.00
6 3 4.10
Вариант 20. Удалить каждого K-го
Удалить каждый K-й узел (позиции 1-based). 1 <= K <= N. K вводится после списка.
Пример ввода:
5
1 1 4.00
2 2 3.50
3 3 4.90
4 4 3.80
5 5 4.10
3
Пример вывода:
1 1 4.00
2 2 3.50
4 4 3.80
5 5 4.10
Варианты повышенной сложности
Вариант П1. Разворот двусвязного списка
Развернуть двусвязный список, переставив ссылки prev и next.
Пример ввода:
4
1 1 4.00
2 2 3.50
3 3 4.90
4 4 3.80
Пример вывода:
4 4 3.80
3 3 4.90
2 2 3.50
1 1 4.00
Вариант П2. Обмен половин
Поменять местами первую и вторую половины двусвязного списка. При нечётном N средний элемент остаётся в конце первой половины.
Пример ввода:
6
1 1 4.00
2 2 3.50
3 3 4.90
4 4 3.80
5 5 4.10
6 6 3.20
Пример вывода:
4 4 3.80
5 5 4.10
6 6 3.20
1 1 4.00
2 2 3.50
3 3 4.90
Вариант П3. Сдвиг двусвязного списка
Циклически сдвинуть двусвязный список на K вправо. 0 <= K <= N. K вводится после списка.
Пример ввода:
5
1 1 4.50
2 2 3.80
3 3 4.90
4 1 4.10
5 2 3.50
2
Пример вывода:
4 1 4.10
5 2 3.50
1 1 4.50
2 2 3.80
3 3 4.90
Вариант П4. Разделение по порогу
Разделить двусвязный список на два: score >= T и score < T. Вывести два блока, разделённые пустой строкой. T вводится после списка.
Пример ввода:
4
1 1 4.00
2 2 3.20
3 3 3.50
4 1 2.80
3.5
Пример вывода:
1 1 4.00
3 3 3.50
2 2 3.20
4 1 2.80
Вариант П5. Чередующееся слияние двусвязных списков
Слить два двусвязных списка, чередуя элементы. Остаток более длинного добавить в конец. Второй список вводится после первого.
Пример ввода:
3
10 1 4.00
30 3 4.90
50 5 4.10
2
20 2 3.50
40 4 3.80
Пример вывода:
10 1 4.00
20 2 3.50
30 3 4.90
40 4 3.80
50 5 4.10
Варианты высокого уровня
Вариант В1. Сдвиг кольца
Циклически сдвинуть кольцо на K вправо. Ввод: N K, затем N пар type value. 0 <= K <= N.
Пример ввода:
5 2
1 10
1 20
1 30
1 40
1 50
Пример вывода:
1 40
1 50
1 10
1 20
1 30
Вариант В2. Обмен половин кольца
Поменять местами две половины кольца. При нечётном N средний элемент остаётся в конце первой половины.
Пример ввода:
4
1 10
2 20.50
1 30
2 40.50
Пример вывода:
1 30
2 40.50
1 10
2 20.50
Вариант В3. Разделение кольца по типу
Разделить кольцо на два: сначала int (type = 1), затем double (type = 2). Порядок внутри типа сохранить. Вывести два блока через пустую строку.
Пример ввода:
4
1 42
2 3.14
1 -7
2 2.50
Пример вывода:
1 42
1 -7
2 3.14
2 2.50
Вариант В4. Слияние двух колец
Слить два кольца в одно, сохранив порядок ввода: сначала первое кольцо, затем второе.
Пример ввода:
3
1 10
2 20.50
1 30
2
2 40.50
1 50
Пример вывода:
1 10
2 20.50
1 30
2 40.50
1 50
Вариант В5. Разворот кольца
Развернуть кольцо, изменив направление обхода.
Пример ввода:
4
1 42
2 3.14
1 -7
2 2.50
Пример вывода:
2 2.50
1 -7
2 3.14
1 42