https://coderun.yandex.ru/problem/new_year_greeting Средняя

Решение

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

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

    val firstLine = reader.readLine().split(" ")
    val n = firstLine[0].toInt()
    val T = firstLine[1].toLong()

    val friends = Array(n) { Pair(0L, 0L) }
    for (i in 0 until n) {
        val parts = reader.readLine().split(" ")
        val x = parts[0].toLong()
        val t = parts[1].toLong()
        friends[i] = Pair(x, t)
    }

    fun can(k: Int): Boolean {
        if (k == 0) return true
        if (k == 1) {
            for (i in 0 until n) {
                if (friends[i].first + friends[i].second <= T) return true
            }
            return false
        }
        var sum: Long = 0
        val heap = PriorityQueue<Long>(compareByDescending { it })
        for (i in 0 until n) {
            if (heap.size == k - 1) {
                val total = friends[i].first + friends[i].second + sum
                if (total <= T) return true
            }
            heap.add(friends[i].second)
            sum += friends[i].second
            if (heap.size > k - 1) {
                sum -= heap.poll()
            }
        }
        return false
    }

    var lo = 0
    var hi = n
    var ans = 0
    while (lo <= hi) {
        val mid = (lo + hi) / 2
        if (can(mid)) {
            ans = mid
            lo = mid + 1
        } else {
            hi = mid - 1
        }
    }

    writer.write(ans.toString())
    writer.flush()
    reader.close()
    writer.close()
}