日期:2025年4月1日
ZeroJudge 題目連結:h035. 夜市 (Night Market)
解題想法
注意題目中的這句「但一塊板子只會採計一次得分」,不能重複計分。測資應該只有單筆輸入。
Python 程式碼
使用時間約為 20 ms,記憶體約為 3.3 MB,通過測試。
import sys
for line in sys.stdin:
n = int(line) # 投球 n 次
down = [-1]*10 # 各編號的格子被打落的時刻,-1 代表沒有被打落
hit = [False]*10 # 各編號的格子是否被打落過
cnt, score, perfect = 0, 0, False # 目前打落的板子數量,總分,是否全清
for i, x in enumerate(list(map(int, input().split())), start=1): # 依序讀取投球命中的格子
for j in range(1, 10): # 檢查每塊板子是否能升起
if down[j] != -1 and i == down[j] + 12: # 如果第 j 塊板子已被打落而且 i 等於第 j 塊板子被打落的時刻加 12
down[j] = -1; cnt -= 1 # 升起第 j 塊板子,cnt 減 1
if x != -1 and down[x] == -1: # 如果 x 不等於 -1 而且 x 號板子目前沒有被打落
cnt += 1; down[x] = i # cnt 加 1,設定 x 被打落的時刻為 i
if not hit[x]: # 如果 x 號板子沒有被打落過
score += x; hit[x] = True # 分數加 x,x 號板子被打落過
if cnt == 9: # 如果 cnt 等於 9,全清,中止迴圈
perfect = True; break
print("perfect" if perfect else score)
C++ 程式碼
使用時間約為 2 ms,記憶體約為 340 kB,通過測試。
#include <iostream>
#include <vector>
using namespace std;
int main() {
ios::sync_with_stdio(0); cin.tie(0);
int n; cin >> n; // 投球 n 次
vector<int> down (10, -1); // 各編號的格子被打落的時刻,-1 代表沒有被打落
vector<bool> hit (10, false); // 各編號的格子是否被打落過
int cnt = 0, score = 0; // 目前打落的板子數量,總分
for(int i=1, x; i<=n; i++) { // 依序讀取投球命中的格子
cin >> x;
for(int j=1; j<=9; j++) { // 檢查每塊板子是否能升起
if (down[j] != -1 && i == down[j] + 12) { // 如果第 j 塊板子已被打落而且 i 等於第 j 塊板子被打落的時刻加 12
down[j] = -1; cnt--; // 升起第 j 塊板子,cnt 減 1
}
}
if (x != -1 && down[x] == -1) { // 如果 x 不等於 -1 而且 x 號板子目前沒有被打落
cnt++; down[x] = i; // cnt 加 1,設定 x 被打落的時刻為 i
if (!hit[x]) { // 如果 x 號板子沒有被打落過
score += x; hit[x] = true; // 分數加 x,x 號板子被打落過
}
}
if (cnt == 9) break; // 如果 cnt 等於 9,全清,中止迴圈
}
if (cnt == 9) cout << "perfect\n";
else cout << score << "\n";
return 0;
}
沒有留言:
張貼留言