r488 彗星撞擊
題目描述
在一個大小為 的平原上,每個格子的初始高度均為 。平原上分佈著 隻恐龍。接下來會有 次彗星撞擊,每次撞擊範圍為以 為中心、邊長為 的正方形區域,撞擊深度為 。
撞擊規則:
- 優先判定恐龍:若撞擊範圍內有任何「清醒」的恐龍,彗星會將範圍內所有恐龍砸暈(數量歸零),但地面高度不會改變。
- 地形下陷:若範圍內完全沒有清醒的恐龍,則該區域內地表高度全部下降 。
目標:輸出最終地圖的 最高高度、最低高度 以及 剩餘清醒恐龍總數。
解題思路
這是一道典型的 二維陣列模擬題。解題的核心在於精確處理座標系統以及「兩階段」的範圍判定。
1. 座標系統與陣列宣告
在 C++ 中,建議使用 vector<vector<int>> 或將大陣列宣告在全域,以避免 Stack Overflow。
- 座標對應:題目給的 通常是 。在陣列操作中,我們習慣使用
mapp[y][x],即mapp[b][a]。 - 範圍邊界:以 為中心,範圍是 與 。必須加上
if判斷,確保座標不超出 與 的範圍。
2. 模擬撞擊的兩階段邏輯
每次彗星撞擊時,不能「邊檢查邊扣血」,否則會導致判定錯誤。必須拆分為兩步:
- 第一步(掃描):跑一次範圍迴圈,檢查是否有任何
dinosaur[k][l] > 0。如果有,記錄hasDino = true並將該格清零。 - 第二步(執行):掃描結束後,根據
hasDino的結果決定是否要再跑一次迴圈來更新mapp[k][l]的高度。
3. 效能優化
- 時間複雜度:。當 與 較大時,運算量會逼近 。
- I/O 優化:使用
ios::sync_with_stdio(false); cin.tie(0);加快讀取速度。
程式C++
1 |
|
Leave a comment