https://coderun.yandex.ru/problem/lucky-number Средняя

Решение

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

fun main() {
    val reader = BufferedReader(InputStreamReader(System.`in`))
    val writer = BufferedWriter(OutputStreamWriter(System.out))
    val x = reader.readLine().trim()
    val n = x.length
    val k = n / 2
    val digits = IntArray(n) { x[it] - '0' }
    val pre = IntArray(n + 1)
    for (i in 0 until n) {
        pre[i + 1] = pre[i] + digits[i]
    }

    val y = IntArray(n)
    var found = false

    for (p in n - 1 downTo 0) {
        val orig = digits[p]
        for (d in orig + 1..9) {
            val sum1Fixed = if (p < k) pre[p] + d else pre[k]
            val sum2Fixed = if (p < k) 0 else (pre[p] - pre[k] + d)
            val suffix1 = if (p < k - 1) (k - p - 1) else 0
            val suffix2 = if (p + 1 <= k) (n - k) else (n - p - 1)
            val diffInit = sum1Fixed - sum2Fixed
            if (suffix1 == 0 && (diffInit < 0 || diffInit > suffix2 * 9)) continue
            for (i in 0 until p) {
                y[i] = digits[i]
            }
            y[p] = d
            var diff = diffInit
            var rem1 = suffix1
            var rem2 = suffix2
            for (i in p + 1 until n) {
                if (i < k) {
                    rem1--
                    val maxDiff = rem2 * 9
                    val minDiff = -rem1 * 9
                    val lo = (minDiff - diff).coerceAtLeast(0)
                    y[i] = lo
                    diff += lo
                } else {
                    rem2--
                    val maxDiff = rem2 * 9
                    val minDiff = -rem1 * 9
                    val lo = (diff - maxDiff).coerceAtLeast(0)
                    y[i] = lo
                    diff -= lo
                }
            }
            val sb = StringBuilder(n)
            for (dgt in y) sb.append(dgt)
            writer.write(sb.toString())
            writer.newLine()
            found = true
            break
        }
        if (found) break
    }

    if (!found) {
        val sb = StringBuilder(n)
        for (i in 0 until k - 1) sb.append('0')
        sb.append('1')
        for (i in k until n - 1) sb.append('0')
        sb.append('1')
        writer.write(sb.toString())
        writer.newLine()
    }

    writer.flush()
    writer.close()
    reader.close()
}