Bài toán

Link đến bài toán: 1921. Eliminate Maximum Number of Monsters

Phân tích

Áp dụng công thức vật lý thời gian bằng quãng đường chia vận tốc, mình suy ra công thức t[t] = ceil(dist[i] / speed[i]) Với t[t]: thời gian quái thứ i đến nơi.

Sau đó, mình sắp xếp lại mảng t[t] theo thứ tự tăng dần, và bởi vì ban đầu súng đã được nạp sẵn, nên ta có thể duyệt từ i = 1 (thời điểm phút thứ 1). Sau đó, ta đếm xem tại thời điểm i phút thì t[i] có lớn hơn i hay không, nếu có thì ta tăng biến đếm lên 1. Nếu không thì ta dừng vòng lặp và trả về biến đếm.

Giải thuật

func eliminateMaximum(dist []int, speed []int) int {
	n := len(dist)
	timeToReach := make([]int, n)
	for i, v := range dist {
		timeToReach[i] = v / speed[i]
		if v%speed[i] != 0 {
			timeToReach[i]++
		}
	}

	sort.Ints(timeToReach)
	res := 1
	for i := 1; i < n; i++ {
		if timeToReach[i] > i {
			res++
		} else {
			break
		}
	}

	return res
}