熱門文章

2025年4月1日 星期二

ZeroJudge 解題筆記:h035. 夜市 (Night Market)

作者:王一哲
日期: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;
}


沒有留言:

張貼留言