熱門文章

2026年3月1日 星期日

ZeroJudge 解題筆記:c094. 00661 - Blowing Fuses

作者:王一哲
日期:2026年3月1日


ZeroJudge 題目連結:c094. 00661 - Blowing Fuses

解題想法


用陣列記錄每個電器是否開啟,依序讀取操作的電器編號,更新電器使用狀態及總電流。用一個布林值記錄是否已經燒掉,如果總電流過大標記為 True。

Python 程式碼


使用時間約為 7 ms,記憶體約為 2.9 MB,通過測試。
import sys

ca = 0  # 第幾次測試
for line in sys.stdin:
    n, m, c = map(int, line.split())  # n 個電器,m 次操作,最大電流 c
    if n == 0 and m == 0 and c == 0: break  # 中止迴圈的條件
    ca += 1  # ca 加 1
    if ca > 1: print()  # 如果不是第 1 次測試,先印出空白列
    current = [0] + [int(sys.stdin.readline()) for _ in range(n)]  # 讀取 n 個電器的電流,開頭加 0
    blown = False  # 是否已燒掉
    curr, imax = 0, 0  # 目前的電流,電流最大值
    turn_on = [False]*(n+1)  # 電器狀態,預設為關閉
    for _ in range(m):  # 讀取 m 次操作
        idx = int(sys.stdin.readline())  # 電器編號
        if blown: continue  # 如果已燒掉,繼續讀完剩下的操作
        turn_on[idx] = not turn_on[idx]  # 更新電器的狀態
        if turn_on[idx]: curr += current[idx]  # 如果開啟,加上這個電器的電流
        else: curr -= current[idx]  # 如果關閉,減去這個電器的電流
        if curr > c: blown = True  # 如果 curr 大於 c,已燒掉
        else: imax = max(imax, curr)  # 反之,更新最大電流
    print(f"Sequence {ca:d}")  # 印出答案
    if blown:
        print("Fuse was blown.")
    else:
        print("Fuse was not blown.")
        print(f"Maximal power consumption was {imax:d} amperes.")


C++ 程式碼


使用時間約為 0 ms,記憶體約為 44 kB,通過測試。
#include <cstdio>

int main() {
    int ca = 0, n, m, c;  // 第幾次測試,n 個電器,m 次操作,最大電流 c
    while(scanf("%d %d %d", &n, &m, &c) != EOF) {
        if (n == 0 && m == 0 && c == 0) break;  // 中止迴圈的條件
        ca++;  // ca 加 1
        if (ca > 1) puts("");  // 如果不是第 1 次測試,先印出空白列
        int current[n+1] = {0};  // 讀取 n 個電器的電流,開頭加 0
        for(int i=1; i<=n; i++) scanf("%d", &current[i]);
        bool blown = false, turn_on[n+1] = {false};  // 是否已燒掉,電器狀態
        int curr = 0, imax = 0;  // 目前的電流,電流最大值
        for(int i=0; i<m; i++) {  // 讀取 m 次操作
            int idx; scanf("%d", &idx);  // 電器編號
            if (blown) continue;  // 如果已燒掉,繼續讀完剩下的操作
            turn_on[idx] = !turn_on[idx];  // 更新電器的狀態
            if (turn_on[idx]) curr += current[idx];  // 如果開啟,加上這個電器的電流
            else curr -= current[idx];  // 如果關閉,減去這個電器的電流
            if (curr > c) blown = true;  // 如果 curr 大於 c,已燒掉
            else if (curr > imax) imax = curr;  // 反之,更新最大電流
        }
        printf("Sequence %d\n", ca);  // 印出答案
        if (blown) {
            puts("Fuse was blown.");
        } else {
            puts("Fuse was not blown.");
            printf("Maximal power consumption was %d amperes.\n", imax);
        }
    }
    return 0;
}


沒有留言:

張貼留言