熱門文章

2025年8月2日 星期六

ZeroJudge 解題筆記:b762. 英國聯蒙

作者:王一哲
日期:2025年8月2日


ZeroJudge 題目連結:b762. 英國聯蒙

解題想法


這題用字典或串列儲存對應的訊息,寫起來會比較簡潔。

Python 程式碼


使用時間約為 18 ms,記憶體約為 3.4 MB,通過測試。
act = {"Get_Kill": 1, "Get_Assist": 2, "Die": 3}  # 輸入的狀態
# 連續擊殺數對應的訊息
kill_mess = ["",
             "You have slain an enemie.",
             "You have slain an enemie.",
             "KILLING SPREE!",
             "RAMPAGE~",
             "UNSTOPPABLE!",
             "DOMINATING!",
             "GUALIKE!",
             "LEGENDARY!"]
# 陣亡時連續擊殺數對應的訊息
die_mess = [ "You have been slained.",
             "SHUTDOWN."]

N = int(input())  # 指令數量
cont = 0  # 連續擊殺數
kill = 0  # 總擊殺數
ast = 0  # 助攻次數
die = 0  # 陣亡次數
for _ in range(N):
    a = act[input().strip()]  # 讀取 N 行指令,要用 strip() 刪除某些測資後方多的 \t 或空白
    if a == 1:  # 如果是 Get_Kill
        cont += 1  # 連續擊殺數加 1
        if cont >= 8: print(kill_mess[8])  # 如果連續擊殺數大於等於 8,印出 kill_mess[8]
        else: print(kill_mess[cont])  # 否則印出 kill_mess[cont]
    elif a == 2: ast += 1  # 如果是 Get_Assist 助攻數加 1
    elif a == 3:  # 如果是 Die
        if cont < 3: print(die_mess[0])  # 如果連續擊殺數小於 3,印出 die_mess[0]
        else: print(die_mess[1])  # 否則印出 die_mess[1]
        die += 1  # 陣亡次數加 1
        kill += cont  # 更新擊殺總數
        cont = 0  # 連續擊殺數歸零
kill += cont  # 最後要再加上一次連續擊殺數
print(f"{kill:d}/{die:d}/{ast:d}")  # 印出答案


C++ 程式碼


使用時間約為 2 ms,記憶體約為 332 kB,通過測試。
#include <iostream>
#include <string>
#include <map>
using namespace std;

int main() {
    ios::sync_with_stdio(0); cin.tie(0);
    map<string, int> act = {{"Get_Kill", 1}, {"Get_Assist", 2}, {"Die", 3}};  // 輸入的狀態
    /* 連續擊殺數對應的訊息 */
    string kill_mess[9] = {"",
                           "You have slain an enemie.",
                           "You have slain an enemie.",
                           "KILLING SPREE!",
                           "RAMPAGE~",
                           "UNSTOPPABLE!",
                           "DOMINATING!",
                           "GUALIKE!",
                           "LEGENDARY!"};
    /* 陣亡時連續擊殺數對應的訊息 */
    string die_mess[2] = {"You have been slained.",
                          "SHUTDOWN."};
    /* 解題過程 */
    int N; cin >> N;  // 指令數量
    int cont = 0, kill = 0, ast = 0, die = 0;  // 連續擊殺數,總擊殺數,助攻次數,陣亡次數
    for(int i=0; i<N; i++) {
        string s; cin >> s;  // 讀取 N 行指令
        int a = act[s];  // 指令對應的編號
        if (a == 1) {  // 如果是 Get_Kill
            cont++;  // 連續擊殺數加 1
            if (cont >= 8) cout << kill_mess[8] << "\n";  // 如果連續擊殺數大於等於 8,印出 kill_mess[8]
            else cout << kill_mess[cont] << "\n";  // 否則印出 kill_mess[cont]
        } else if (a == 2) {
            ast++;  // 如果是 Get_Assist 助攻數加 1
        } else if (a == 3) {  // 如果是 Die
            if (cont < 3) cout << die_mess[0] << "\n";  // 如果連續擊殺數小於 3,印出 die_mess[0]
            else cout << die_mess[1] << "\n";  // 否則印出 die_mess[1]
            die++;  // 陣亡次數加 1
            kill += cont;  // 更新擊殺總數
            cont = 0;  // 連續擊殺數歸零
        }
    }
    kill += cont;  // 最後要再加上一次連續擊殺數
    cout << kill << "/" <<  die << "/" << ast <<"\n";  // 印出答案
    return 0;
}


沒有留言:

張貼留言