https://coderun.yandex.ru/problem/k-segments/description Легкая

Решение

import java.io.BufferedReader
import java.io.BufferedWriter
import java.io.InputStreamReader
import java.io.OutputStreamWriter

fun canCover(points: LongArray, k: Int, length: Long): Boolean {
    var segmentsUsed = 1
    var segmentStart = points[0]
    
    for (i in 1 until points.size) {
        if (points[i] - segmentStart > length) {
            segmentsUsed++
            segmentStart = points[i]
        }
    }
    
    return segmentsUsed <= k
}

fun main(args: Array<String>) {
    val reader = BufferedReader(InputStreamReader(System.`in`))
    val writer = BufferedWriter(OutputStreamWriter(System.out))
    
    val (n, k) = reader.readLine().split(" ").map { it.toInt() }
    val points = reader.readLine().split(" ").map { it.toLong() }.sorted().toLongArray()
    
    var left = 0L
    var right = points.last() - points.first()
    var answer = right
    
    // Бинарный поиск по ответу
    while (left <= right) {
        val mid = left + (right - left) / 2
        
        if (canCover(points, k, mid)) {
            answer = mid
            right = mid - 1
        } else {
            left = mid + 1
        }
    }
    
    writer.write(answer.toString())
    writer.newLine()
    
    reader.close()
    writer.close()
}