I've tried to solve this challenge about 4 hours during the contest, but all my attempts exceeded the time limit. I tried to solve it with min-heap, but can't pass all the tests. How it can be solved within given time and space requirements?
Problem statement
Programmer Alexey likes to work at night and does not like to come to work late. In order to precisely wake up in the morning, Alexey every evening starts \$N\$ alarm clocks on his phone. Each alarm clock is arranged in such a way that it rings every \$X\$ minutes from the time at which it was turned on.
For example, if the alarm clock was started at the moment of time \$t_i\$, then it will ring at the moments of time \$t_i, t_i + X, t_i + 2 * X\$ and so on. Moreover, if some two alarms begin to ring at one time, only one of them is displayed.
It is known that before waking up, Alexey listens every morning to exactly \$K\$ alarm clocks, and then wakes up. Determine the point in time when Alex wakes up.
Input format
Input format The first line contains three integers. \$N, X\$ and \$K\$ \$(1 ≤ N ≤10^5, 1≤X, K≤10^9)\$ - the number of alarms, the frequency of calls and the number of alarms that need to be turned off in order for Alex to wake up. The second line contains N integers - the points in time at which the alarm clocks were entered.
Requirements
Time limit: 2 seconds Memory limit: 256Mb
Examples
Example 1
Input
6 5 10 1 2 3 4 5 6
Output
10
Example 2
Input
5 7 12 5 22 17 13 8
Output
27
Notes
In the second example, there are 5 alarm clocks with a frequency of 7 calls. For example, the first alarm clock will ring at times 5, 12, 19, 26, 33, etc. If you look at all the alarms at the same time, they will ring at the following times: 5, 8, 12, 13, 15, 17, 19, 20, 22 (2nd and 5th alarm clocks at the same time), 24, 26, 27, 29,…. On the 12th call Alexey must wake up, What corresponds to the point in time 27.
My solution
Classified as "time limit exceeded"
import heapq
def main():
n, x, k = map(int, input().split(" "))
times = list(map(int, input().split(" ")))
heapq.heapify(times)
answers = []
while k:
v = heapq.heappop(times)
heapq.heappush(times, v + x)
if len(answers) == 0 or answers[len(answers)-1] != v:
answers.append(v)
k -= 1
print(answers[k-1])
if __name__ == "__main__":
main()