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

Условие

На некоторых кросс-платформенных станциях метро (как, например, «Третьяковская») на разные стороны платформы приходят поезда разных направлений. Таня договорилась встретиться с подругой на такой станции, но поскольку подруга приехала из другого часового пояса, то из-за джетлага сильно проспала, и Тане пришлось долго её ждать. Поезда всегда ходят точно по расписанию, и Таня знает, что поезд стоит на платформе ровно одну минуту, а интервал между поездами (время, в течение которого поезда у платформы нет) составляет a a минут для поездов на первом пути и b минут для поездов на втором пути. То есть на первый путь приезжает поезд и стоит одну минуту, затем в течение a a минут поезда у платформы нет, затем в течение одной минуты у платформы стоит следующий поезд и т.д.

Пока Таня стояла на платформе, она насчитала n поездов на первом пути и m поездов на втором пути. Определите минимальное и максимальное время, которое Таня могла провести на платформе, или сообщите, что она точно сбилась со счёта.

Все поезда, которые видела Таня, она наблюдала в течение всей минуты, то есть Таня не приходит и не уходит с платформы посередине той минуты, когда поезд стоит на платформе.

Примеры

Ввод:

1 3 3 2 Вывод: 5 7

Ввод:

1 5 1 2 Вывод: -1

Решение

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

// Функция вычисляет пересечение временных промежутков, в которые поезда могут встретиться
private fun metro(interval1: Int, interval2: Int, count1: Int, count2: Int): Pair<Int, Int>? {
    val minTime1 = interval1 * (count1 - 1) + count1 // Минимальное время первого поезда
    val maxTime1 = minTime1 + interval1 * 2 // Максимальное время первого поезда
    val minTime2 = interval2 * (count2 - 1) + count2 // Минимальное время второго поезда
    val maxTime2 = minTime2 + interval2 * 2 // Максимальное время второго поезда

    return if (minTime1 > maxTime2 || maxTime1 < minTime2) {
        null // Если поезда не пересекаются
    } else {
        Pair(maxOf(minTime1, minTime2), minOf(maxTime1, maxTime2)) // Возвращаем интервал пересечения
    }
}

fun main() {
    val reader = BufferedReader(InputStreamReader(System.`in`))
    val writer = BufferedWriter(OutputStreamWriter(System.out))

    // Читаем входные данные
    val interval1 = reader.readLine().toInt()
    val interval2 = reader.readLine().toInt()
    val count1 = reader.readLine().toInt()
    val count2 = reader.readLine().toInt()

    val res = metro(interval1, interval2, count1, count2) // Вычисляем временной интервал пересечения
    
    // Выводим результат, либо -1, если пересечения нет
    writer.write(res?.let { "${res.first} ${res.second}" } ?: "-1")
    writer.newLine()

    reader.close()
    writer.close()
}