https://coderun.yandex.ru/problem/sorting-of-wagons-lite/description | Легкая |
---|
К тупику со стороны пути 1 (см. рисунок) подъехал поезд. Разрешается отцепить от поезда один или сразу несколько первых вагонов и завезти их в тупик (при желании, можно даже завезти в тупик сразу весь поезд). После этого часть из этих вагонов вывезти в сторону пути 2. После этого можно завезти в тупик еще несколько вагонов и снова часть оказавшихся вагонов вывезти в сторону пути 2. И так далее (так, что каждый вагон может лишь один раз заехать с пути 1 в тупик, а затем один раз выехать из тупика на путь 2). Заезжать в тупик с пути 2 или выезжать из тупика на путь 1 запрещается. Нельзя с пути 1 попасть на путь 2, не заезжая в тупик.
Известно, в каком порядке изначально идут вагоны поезда. Требуется с помощью указанных операций сделать так, чтобы вагоны поезда шли по порядку (сначала первый, потом второй и т.д., считая от головы поезда, едущего по пути 2 в сторону от тупика). Напишите программу, определяющую, можно ли это сделать.
Ввод:
3 3 2 1Вывод:
YES
Ввод:
4 4 1 3 2Вывод:
YES
Ввод:
3 2 3 1Вывод:
NO
import java.io.BufferedReader
import java.io.BufferedWriter
import java.io.InputStreamReader
import java.io.OutputStreamWriter
import java.util.Stack
fun main() {
val reader = BufferedReader(InputStreamReader(System.`in`))
val writer = BufferedWriter(OutputStreamWriter(System.out))
val n = reader.readLine().toInt() // Количество вагонов
val cars = reader.readLine().trim().split(" ").map(String::toInt) // Порядок вагонов
val stack = Stack<Int>()
var current = 1
for (car in cars) {
stack.push(car) // Помещаем вагон в тупик
// Пока верхний вагон соответствует ожидаемому номеру, убираем его
while (stack.isNotEmpty() && stack.peek() == current) {
stack.pop()
current++
}
}
// Если все вагоны упорядочены, выводим YES, иначе NO
writer.write(if (stack.isEmpty()) "YES" else "NO")
reader.close()
writer.close()
}