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

Решение

import java.io.BufferedReader
import java.io.BufferedWriter
import java.io.InputStreamReader
import java.io.OutputStreamWriter
import kotlin.math.max
import kotlin.math.min

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

    val n = reader.readLine().toInt()
    val prices = listOf(0L) + reader.readLine().split(" ").map { it.toLong() }
    val comboPriceX = reader.readLine().toLong()
    val comboItems = reader.readLine().split(" ").map { it.toInt() }
    val k = reader.readLine().toInt()
    val desiredItemsInput = reader.readLine().split(" ").map { it.toInt() }

    val neededCount = IntArray(n + 1)
    for (itemIndex in desiredItemsInput) {
        if (itemIndex in 1..n) {
            neededCount[itemIndex]++
        }
    }

    var minTotalCost = Long.MAX_VALUE
    val maxCombosToConsider = k + 1

    for (numCombos in 0..maxCombosToConsider) {
        var currentCost = numCombos * comboPriceX
        val remainingNeeded = neededCount.clone()
        for (comboItemIndex in comboItems) {
            remainingNeeded[comboItemIndex] = max(0, remainingNeeded[comboItemIndex] - numCombos)
        }
        var individualCost = 0L
        for (itemIndex in 1..n) {
            individualCost += remainingNeeded[itemIndex] * prices[itemIndex]
        }
        minTotalCost = min(minTotalCost, currentCost + individualCost)
    }

    writer.write(minTotalCost.toString())
    writer.newLine()
    reader.close()
    writer.close()
}