Eliminate Maximum Number of Monsters

medium greedy sorting

Problem

Each monster i is dist[i] away approaching at speed[i]. You fire one shot per minute starting at t=1. Return how many monsters you can shoot before any reaches you.

Inputdist = [1,3,4], speed = [1,1,1]
Output3
Arrivals 1,3,4; sorted same; shoot at minutes 1,2,3 — all gone.

def eliminate_maximum(dist, speed):
    times = sorted(-(-d // s) for d, s in zip(dist, speed))
    for i, t in enumerate(times):
        if t <= i: return i
    return len(times)
function eliminateMaximum(dist, speed) {
  const t = dist.map((d, i) => Math.ceil(d / speed[i])).sort((a, b) => a - b);
  for (let i = 0; i < t.length; i++) if (t[i] <= i) return i;
  return t.length;
}
class Solution {
    public int eliminateMaximum(int[] dist, int[] speed) {
        int n = dist.length;
        int[] t = new int[n];
        for (int i = 0; i < n; i++) t[i] = (dist[i] + speed[i] - 1) / speed[i];
        Arrays.sort(t);
        for (int i = 0; i < n; i++) if (t[i] <= i) return i;
        return n;
    }
}
int eliminateMaximum(vector<int>& dist, vector<int>& speed) {
    int n = dist.size();
    vector<int> t(n);
    for (int i = 0; i < n; i++) t[i] = (dist[i] + speed[i] - 1) / speed[i];
    sort(t.begin(), t.end());
    for (int i = 0; i < n; i++) if (t[i] <= i) return i;
    return n;
}
Time: O(n log n) Space: O(n)