遊戲模擬題 消滅最大數量的怪獸 Eliminate Max Num of Monsters_Leetcode#1921

閱讀時間約 6 分鐘
raw-image

這題的題目在這裡:

題目敘述

這題的場景是防禦城市,免於怪獸的入侵

題目會給定兩個陣列:

一個是dist,代表怪獸和城市之間的距離

一個是speed,代表怪獸每分鐘前進的距離,也就是怪獸的速度

我們有一把一開始已經充滿電的電動槍,一槍可以擊殺一隻怪獸,擊發後需要耗費一分鐘的冷卻時間讓電動槍再次充滿電。


當怪獸抵達城市的時候,我們就算輸了。


題目要求我們計算最多可以消滅幾隻怪獸


測試範例

Example 1:

Input: dist = [1,3,4], speed = [1,1,1]
Output: 3
Explanation:
In the beginning, the distances of the monsters are [1,3,4]. You eliminate the first monster.
After a minute, the distances of the monsters are [X,2,3]. You eliminate the second monster.
After a minute, the distances of the monsters are [X,X,2]. You eliminate the thrid monster.
All 3 monsters can be eliminated.

Example 2:

Input: dist = [1,1,2,3], speed = [1,1,1,1]
Output: 1
Explanation:
In the beginning, the distances of the monsters are [1,1,2,3]. You eliminate the first monster.
After a minute, the distances of the monsters are [X,0,1,2], so you lose.
You can only eliminate 1 monster.

Example 3:

Input: dist = [3,2,4], speed = [5,3,2]
Output: 1
Explanation:
In the beginning, the distances of the monsters are [3,2,4]. You eliminate the first monster.
After a minute, the distances of the monsters are [X,0,2], so you lose.
You can only eliminate 1 monster.

約束條件

Constraints:

  • n == dist.length == speed.length
  • 1 <= n <= 10^5
  • 1 <= dist[i], speed[i] <= 10^5

演算法

題目已經給我們怪獸的距離,和怪獸的速度。我們可以接著計算出怪獸抵達城市的秒數。

然後,把計算出來的秒數,也就是怪獸抵達城市的先後次序由小到大排序好。

這一步驟用到了排序的觀念。


下一步,為了最大化怪獸擊殺數量,也就是最大化我方存活時間,就是依照怪獸威脅的輕重緩急,也就是怪獸抵達城市的先後次序,我們就按照這個順序去消滅怪獸。

這一步驟用到了Greedy 貪心的觀念,局部最優解導出全局最優解


最後,當遊戲結束(怪獸已經抵達城市,或者我方率先消滅所有怪獸)時,當下的擊殺數量就是怪獸擊殺數量的最大值


程式碼

class Solution:
 def eliminateMaximum(self, dist: List[int], speed: List[int]) -> int:
  
  n = len(dist)

  # Time of arrival = distance / speed
  time_of_arrival = [ d/s for d, s in zip(dist, speed) ]

  # Keep time of arrival sorted in ascending order
  # And we will shoot monster with this order
  time_of_arrival.sort()

  # Simulate the shooting process
  for i_th_monster in range(n):

   # one shot per minute
   shooting_time = i_th_monster
   
   if time_of_arrival[i_th_monster] <= shooting_time:
    # oops, monster already get into city.
    return i_th_monster

  # It's safe now, We can emiminate all monsters!
  # : )
  return n

複雜度分析

時間複雜度:

O( n log n ) 耗費在怪獸秒數(也是怪獸抵達城市的先後次序)的排序上。

空間複雜度:

O(n) time_of_arrival陣列,儲存怪獸抵達城市的秒數,也是抵達城市的先後順序。


關鍵知識點

為了最大化怪獸擊殺數量,也就是最大化我方存活時間,就是依照怪獸威脅的輕重緩急,也就是怪獸抵達城市的先後次序,我們就按照這個順序去消滅怪獸。

這一步驟用到了Greedy 貪心的觀念,局部最優解導出全局最優解


最後,當遊戲結束(怪獸已經抵達城市,或者我方率先消滅所有怪獸)時,當下的擊殺數量就是怪獸擊殺數量的最大值


Reference:

[1] Eliminate Maximum Number of Monsters - LeetCode

avatar-img
90會員
425內容數
由有業界實戰經驗的演算法工程師, 手把手教你建立解題的框架, 一步步寫出高效、清晰易懂的解題答案。 著重在讓讀者啟發思考、理解演算法,熟悉常見的演算法模板。 深入淺出地介紹題目背後所使用的演算法意義,融會貫通演算法與資料結構的應用。 在幾個經典的題目融入一道題目的多種解法,或者同一招解不同的題目,擴展廣度,並加深印象。
留言0
查看全部
avatar-img
發表第一個留言支持創作者!
題目會定義一組類別和介面,要求我們實做餐廳訂位報號系統。 SeatManager(int n) : 初始化餐廳最多有n個座位,n 最少是1 int reserve() : 要求返回最小的可讓客人入座的空座位編號。 void unreserve(int seatNumber) : 取消訂位,這個座位歸
題目會給們一個陣列,還有一個k值。 好陣列定義是: 有包含nums[k]的子陣列。 分數定義是: min(nums[i], nums[i+1], ..., nums[j]) * (j - i + 1) 其中, i, j 分別是子陣列的左端點和右端點 請問,好的子陣列的最大分數是多少?
題目會給們一個陣列,還有一個k值。 接著進行比大小的遊戲,規則如下: 每次取陣列前兩個元素值比大小,比較小的會被重新安排到陣列最後方,陣列前兩個元素值比大小,同樣的,比較小的會被重新安排到陣列最後方。依此類推,反覆進行比大小的遊戲。 請問第一個能連贏k回合的是哪個數字?
題目會給我們兩個陣列left, right 分別代表每隻螞蟻所在的初始位置 和 方向,n代表木板長度。每隻螞蟻每秒鐘前進一單位長度。 問我們,每隻螞蟻從初始位置出發,0秒起算,當兩隻螞蟻相遇時,會互相掉頭,往相反方向前進,問最後一隻螞蟻掉落木板的時候是幾秒鐘?
題目會給我們個陣列target,問我們從整數串流中1~n之中,如何透過stack 的 push和pop來模擬生成target指定的形式?
題目會給一顆二元樹,要求我們計算節點值 和 子樹平均值相等的node有幾個。
題目會定義一組類別和介面,要求我們實做餐廳訂位報號系統。 SeatManager(int n) : 初始化餐廳最多有n個座位,n 最少是1 int reserve() : 要求返回最小的可讓客人入座的空座位編號。 void unreserve(int seatNumber) : 取消訂位,這個座位歸
題目會給們一個陣列,還有一個k值。 好陣列定義是: 有包含nums[k]的子陣列。 分數定義是: min(nums[i], nums[i+1], ..., nums[j]) * (j - i + 1) 其中, i, j 分別是子陣列的左端點和右端點 請問,好的子陣列的最大分數是多少?
題目會給們一個陣列,還有一個k值。 接著進行比大小的遊戲,規則如下: 每次取陣列前兩個元素值比大小,比較小的會被重新安排到陣列最後方,陣列前兩個元素值比大小,同樣的,比較小的會被重新安排到陣列最後方。依此類推,反覆進行比大小的遊戲。 請問第一個能連贏k回合的是哪個數字?
題目會給我們兩個陣列left, right 分別代表每隻螞蟻所在的初始位置 和 方向,n代表木板長度。每隻螞蟻每秒鐘前進一單位長度。 問我們,每隻螞蟻從初始位置出發,0秒起算,當兩隻螞蟻相遇時,會互相掉頭,往相反方向前進,問最後一隻螞蟻掉落木板的時候是幾秒鐘?
題目會給我們個陣列target,問我們從整數串流中1~n之中,如何透過stack 的 push和pop來模擬生成target指定的形式?
題目會給一顆二元樹,要求我們計算節點值 和 子樹平均值相等的node有幾個。
你可能也想看
Google News 追蹤
Thumbnail
  從基本貓的設計思路中,我們也能看到這款遊戲與現在流行的抽卡遊戲的差異。遊戲初期,設計的焦點被放在「攻擊距離」、「攻擊力」、「範圍與單體傷害」、「血量」、「移動速度」以及「花費」這六個項目上,這使得初始的九隻基本貓每隻都能在特定的情境裡面起到作用,也比純數值遊戲有著更多玩家操作與發揮戰術的空間。
Thumbnail
🚗💨 征服者AI 11雷射防護罩 🚨 超速40公里扣牌,罰36,000元! 別讓罰單找上你,裝上【征服者AI 11雷射防護罩】才是聰明選擇!✨ 🌟 功能強大: 最新Digi-VPR數位跳頻設計,雙層防護更安心 可選購加強防護片,提升前後防禦效果 手機APP就能雲端更新,輕鬆升級
Thumbnail
就在師徒倆抵達林谷村的入口時,他們看到一個村民正驚慌失措地被一隻獨眼食人妖追趕。那村民拼命奔跑,但顯然速度不及那兇猛的怪物。眼看著獨眼食人妖的利爪即將抓住他,村民絕望地喊叫著。   索爾毫不猶豫地縱身上前,手中的長劍閃爍著銀白色的光芒。只見他迅速接近獨眼食人妖,動作如同閃電一般迅捷,劍光一閃,準
5. 「那個梅花的目標是我們!我們應該離開這個村子,不然會有更多村民遇害!」我嚴肅的喊道,在克瑞喜的護衛下,就要往村外的方向跑。 「村子後面有條林間小徑。貓,你們快從那邊逃跑!」巴雷指向村落後面的森林。只見名為梅花的怪人不斷從指尖快速射出不
Thumbnail
新魑魅速捷襲來,他倆並時一退,爭取最多的射擊距離。只四發鎗,没有多開一彈,没有浪費軍備珍貴,做成四個威脅消失。   
Thumbnail
小時候雖然沒有在看戰隊的電視劇,但總覺得這樣5人一組還挺有趣的 然後就把這個概念套用到比薩老鼠身上 一開始有跑滾輪發電的-發電戰士 負責打開罐頭的-打兩個洞戰士 負責把食物儲藏在臉頰的-儲藏戰士 看到敵人就會跑走的-落跑戰士 這次重繪才發現,5人戰隊還少一個人,爾且也沒有代表色
Thumbnail
在深山中逃離實驗室,面臨一座破損的吊橋,只有一支手電筒和最多兩人能過橋。成員過橋時間分配不同,需找到最佳過橋順序以最短時間逃脫。
Thumbnail
一個青年在停車場目睹了一個神祕幽靈以及一群巨大機器人對複雜且危險的超自然事件進行的抵抗。混合了神祕、驚悚和奇幻的元素,帶給讀者一場宛如驚險冒險的視覺饗宴。
雖說骷髏士兵的個體戰力並不高,可是它們不會累也不會痛,一個個打死必定會耗費掉我不少體力。 因此我藉著手鎧的神力,從身後的圍牆拆下一大塊殘骸,往大軍扔去。 這又寬又厚的殘骸狠狠輾過路上的所有骷髏,在無盡的人潮中挖開一條大路。 我順著這條路衝進敵軍,力求在被包圍以前拿到藍色石板。
Thumbnail
  從基本貓的設計思路中,我們也能看到這款遊戲與現在流行的抽卡遊戲的差異。遊戲初期,設計的焦點被放在「攻擊距離」、「攻擊力」、「範圍與單體傷害」、「血量」、「移動速度」以及「花費」這六個項目上,這使得初始的九隻基本貓每隻都能在特定的情境裡面起到作用,也比純數值遊戲有著更多玩家操作與發揮戰術的空間。
Thumbnail
🚗💨 征服者AI 11雷射防護罩 🚨 超速40公里扣牌,罰36,000元! 別讓罰單找上你,裝上【征服者AI 11雷射防護罩】才是聰明選擇!✨ 🌟 功能強大: 最新Digi-VPR數位跳頻設計,雙層防護更安心 可選購加強防護片,提升前後防禦效果 手機APP就能雲端更新,輕鬆升級
Thumbnail
就在師徒倆抵達林谷村的入口時,他們看到一個村民正驚慌失措地被一隻獨眼食人妖追趕。那村民拼命奔跑,但顯然速度不及那兇猛的怪物。眼看著獨眼食人妖的利爪即將抓住他,村民絕望地喊叫著。   索爾毫不猶豫地縱身上前,手中的長劍閃爍著銀白色的光芒。只見他迅速接近獨眼食人妖,動作如同閃電一般迅捷,劍光一閃,準
5. 「那個梅花的目標是我們!我們應該離開這個村子,不然會有更多村民遇害!」我嚴肅的喊道,在克瑞喜的護衛下,就要往村外的方向跑。 「村子後面有條林間小徑。貓,你們快從那邊逃跑!」巴雷指向村落後面的森林。只見名為梅花的怪人不斷從指尖快速射出不
Thumbnail
新魑魅速捷襲來,他倆並時一退,爭取最多的射擊距離。只四發鎗,没有多開一彈,没有浪費軍備珍貴,做成四個威脅消失。   
Thumbnail
小時候雖然沒有在看戰隊的電視劇,但總覺得這樣5人一組還挺有趣的 然後就把這個概念套用到比薩老鼠身上 一開始有跑滾輪發電的-發電戰士 負責打開罐頭的-打兩個洞戰士 負責把食物儲藏在臉頰的-儲藏戰士 看到敵人就會跑走的-落跑戰士 這次重繪才發現,5人戰隊還少一個人,爾且也沒有代表色
Thumbnail
在深山中逃離實驗室,面臨一座破損的吊橋,只有一支手電筒和最多兩人能過橋。成員過橋時間分配不同,需找到最佳過橋順序以最短時間逃脫。
Thumbnail
一個青年在停車場目睹了一個神祕幽靈以及一群巨大機器人對複雜且危險的超自然事件進行的抵抗。混合了神祕、驚悚和奇幻的元素,帶給讀者一場宛如驚險冒險的視覺饗宴。
雖說骷髏士兵的個體戰力並不高,可是它們不會累也不會痛,一個個打死必定會耗費掉我不少體力。 因此我藉著手鎧的神力,從身後的圍牆拆下一大塊殘骸,往大軍扔去。 這又寬又厚的殘骸狠狠輾過路上的所有骷髏,在無盡的人潮中挖開一條大路。 我順著這條路衝進敵軍,力求在被包圍以前拿到藍色石板。