https://coderun.yandex.ru/problem/woods/description Легкая

Решение

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()
}