Решение
import java.io.BufferedReader
import java.io.BufferedWriter
import java.io.InputStreamReader
import java.io.OutputStreamWriter
// Функция для поиска максимальной длины покрытия методом бинарного поиска
private fun woods(height: Int, woods: List<Int>): Int {
var left = 0
var right = Int.MAX_VALUE
while (left < right) {
val medium = (left + right + 1) / 2 // Среднее значение текущего диапазона
if (check(woods, height, medium)) {
left = medium // Если возможно покрыть участок, двигаем границу вверх
} else {
right = medium - 1 // Иначе уменьшаем правую границу
}
}
return left // Возвращаем максимальную длину покрытия
}
// Проверка, можно ли покрыть участок заданной длины
private fun check(woods: List<Int>, height: Int, width: Int): Boolean {
var i = 0
repeat(height) { // Проверяем каждый ряд
var currentWidth = 0
while (currentWidth < width) {
if (i > woods.lastIndex) {
return false // Если подстилок не хватает, вернуть false
}
currentWidth += woods[i++] // Добавляем подстилку в ряд
}
}
return true // Если удалось покрыть все ряды, вернуть true
}
fun main() {
val reader = BufferedReader(InputStreamReader(System.`in`))
val writer = BufferedWriter(OutputStreamWriter(System.out))
val height = reader.readLine().split(" ").first().toInt() // Читаем высоту участка
val woods = reader.readLine().split(" ").map { it.toInt() } // Читаем длины подстилок
val res = woods(height, woods) // Находим максимальную длину покрытия
writer.write(res.toString())
writer.newLine()
reader.close()
writer.close()
}