Решение
import java.io.BufferedReader
import java.io.BufferedWriter
import java.io.InputStreamReader
import java.io.OutputStreamWriter
// Функция для проверки возможности расселения
fun canAccommodate(teams: IntArray, rooms: MutableMap<Int, Int>): Boolean {
// Подсчитываем частоты размеров команд
val teamFreq = IntArray(10001) // Максимальный размер 10^4
for (team in teams) {
teamFreq[team]++
}
// Создаем массив остатка комнат
val roomFreq = IntArray(10001)
for ((capacity, count) in rooms) {
roomFreq[capacity] += count
}
// Проверяем размещение от большего размера к меньшему
for (size in 10000 downTo 1) {
if (teamFreq[size] == 0) continue // Пропускаем пустые размеры
var teamsLeft = teamFreq[size]
// Проверяем комнаты от текущего размера и выше
for (roomSize in size..10000) {
if (teamsLeft == 0) break
if (roomFreq[roomSize] > 0) {
val used = minOf(teamsLeft, roomFreq[roomSize])
teamsLeft -= used
roomFreq[roomSize] -= used
}
}
if (teamsLeft > 0) return false // Не удалось разместить все команды
}
return true
}
fun main(args: Array<String>) {
val reader = BufferedReader(InputStreamReader(System.`in`))
val writer = BufferedWriter(OutputStreamWriter(System.out))
// Читаем количество команд
val n = reader.readLine().toInt()
// Читаем размеры команд
val teams = reader.readLine().split(" ").map { it.toInt() }.toIntArray()
// Читаем количество типов комнат
val k = reader.readLine().toInt()
// Создаем карту для хранения вместимости комнат и их количества
val rooms = mutableMapOf<Int, Int>()
for (i in 1..k) {
val (capacity, count) = reader.readLine().split(" ").map { it.toInt() }
rooms[capacity] = rooms.getOrDefault(capacity, 0) + count
}
// Проверяем возможность расселения и выводим результат
if (canAccommodate(teams, rooms)) {
writer.write("Yes")
} else {
writer.write("No")
}
writer.flush()
reader.close()
writer.close()
}