https://coderun.yandex.ru/problem/pyramid/description | Легкая |
---|
Для строительства двумерной пирамиды используются прямоугольные блоки, каждый из которых характеризуется шириной и высотой.
Можно поставить один блок на другой, только если ширина верхнего блока строго меньше ширины нижнего (блоки нельзя поворачивать). Самым нижним в пирамиде может быть блок любой ширины.
По заданному набору блоков определите, пирамиду какой наибольшей высоты можно из них построить.
Ввод:
3 3 1 2 2 3 3Вывод:
5
import java.io.BufferedReader
import java.io.BufferedWriter
import java.io.InputStreamReader
import java.io.OutputStreamWriter
// Функция вычисляет максимальную возможную высоту пирамиды
// Выбирает максимальную высоту блока для каждого уникального основания
private fun pyramid(blocks: List<Pair<Long, Long>>): Long {
val map = HashMap<Long, Long>() // Словарь для хранения максимальной высоты для каждого основания
blocks.forEach { block ->
if ((map[block.first] ?: 0) < block.second) {
map[block.first] = block.second // Обновляем, если нашли блок большей высоты
}
}
return map.map { it.value }.sum() // Суммируем высоты всех уникальных оснований
}
fun main() {
val reader = BufferedReader(InputStreamReader(System.`in`))
val writer = BufferedWriter(OutputStreamWriter(System.out))
val count = reader.readLine().toInt() // Читаем количество блоков
val blocks = List(count) {
val (a, b) = reader.readLine().trim().split(" ").map { it.toLong() }
a to b // Преобразуем в пары (основание, высота)
}
val res = pyramid(blocks) // Вычисляем высоту пирамиды
writer.write(res.toString())
writer.newLine()
reader.close()
writer.close()
}