https://coderun.yandex.ru/problem/average-in-window Средняя

Решение

import java.io.BufferedReader
import java.io.InputStreamReader
import java.io.PrintWriter
import java.util.StringTokenizer
import java.util.Locale

fun main() {
    val reader = BufferedReader(InputStreamReader(System.`in`))
    val st = StringTokenizer(reader.readLine())
    val n = st.nextToken().toInt()
    val k = st.nextToken().toInt()
    val a = IntArray(n)
    val st2 = StringTokenizer(reader.readLine())
    var maxA = 0
    for (i in 0 until n) {
        val v = st2.nextToken().toInt()
        a[i] = v
        if (v > maxA) maxA = v
    }

    val prefix = DoubleArray(n + 1)

    fun check(mid: Double): Boolean {
        prefix[0] = 0.0
        for (i in 0 until n) {
            prefix[i + 1] = prefix[i] + a[i] - mid
        }
        var minPrefix = 0.0
        for (i in k..n) {
            minPrefix = minOf(minPrefix, prefix[i - k])
            if (prefix[i] - minPrefix >= 0.0) return true
        }
        return false
    }

    var low = 0.0
    var high = maxA.toDouble()
    repeat(60) {
        val mid = (low + high) / 2
        if (check(mid)) low = mid else high = mid
    }

    val writer = PrintWriter(System.out)
    writer.format(Locale.US, "%.6f\\n", low)
    writer.flush()
}