https://coderun.yandex.ru/problem/students-and-lectures Сложная

Решение

import java.io.BufferedReader
import java.io.BufferedWriter
import java.io.InputStreamReader
import java.io.OutputStreamWriter
import java.lang.Long.max
import java.lang.Long.MIN_VALUE

fun main(args: Array<String>) {
    val reader = BufferedReader(InputStreamReader(System.`in`))
    val writer = BufferedWriter(OutputStreamWriter(System.out))

    val parts = reader.readLine().split(" ")
    val n = parts[0].toInt()
    val m = parts[1].toInt()

    val a = Array(n) { LongArray(m) }
    val b = Array(n) { LongArray(m) }

    for (i in 0 until n) {
        val rowParts = reader.readLine().split(" ")
        for (j in 0 until m) {
            a[i][j] = rowParts[j].toLong()
        }
    }

    var totalPleasure = 0L
    for (i in 0 until n) {
        val rowParts = reader.readLine().split(" ")
        for (j in 0 until m) {
            b[i][j] = rowParts[j].toLong()
            totalPleasure += b[i][j]
        }
    }

    for (j in 0 until m) {
        var maxGainJ = MIN_VALUE
        var sumPositiveGainsJ = 0L
        var hasPositiveGain = false

        for (i in 0 until n) {
            val gain = a[i][j] - b[i][j]
            maxGainJ = max(maxGainJ, gain)
            if (gain > 0) {
                sumPositiveGainsJ += gain
                hasPositiveGain = true
            }
        }

        if (hasPositiveGain) {
            totalPleasure += sumPositiveGainsJ
        } else {
            totalPleasure += maxGainJ
        }
    }

    writer.write(totalPleasure.toString())
    writer.newLine()
    writer.flush()
}