2026年5月5日 星期二

ZeroJudge 解題筆記:a271. 彩色蘿蔔

作者:王一哲
日期:2026年5月5日


ZeroJudge 題目連結:a271. 彩色蘿蔔

解題想法


首先要排除特例,也就是進食資料是空行的狀況,直接輸出原體重就好。接下來依序讀取每天的進食資料,要先結算中毒造成的效果,由於題目有說毒素會累積,假設目前累積的毒素為 $p$,則每天會使體重減少 $n \times p$,再檢查此時體重 $m$ 是否已經歸零,如果歸零則印出 bye~Rabbit 並中止迴圈。接下來結算進食的效果,依照蘿蔔的種類更新體重,如果吃到黃、黑蘿蔔會減少體重,要再檢查體重 $m$ 是否已經歸零,如果歸零則印出 bye~Rabbit 並中止迴圈。更新完每天的體重之後,如果 $m$ 還沒有歸零,則印出 $m$。

Python 程式碼


使用時間約為 1.8 s,記憶體約為 8.4 MB,通過測試。
T = int(input())
for _ in range(T):
    # 前 4 項為紅、白、黃、黑蘿蔔對應的體重變化
    # n 為中毒狀態每天減少的體重,m 為體重初始值
    x, y, z, w, n, m = map(int, input().split())
    line = input()  # 每天吃的蘿蔔
    if not line:  # 特例,沒有吃蘿蔔,直接輸出原體重
        print(f"{m:d}g")
        continue
    
    p = 0  # 累積的毒素
    for v in map(int, line.split()):  # 每天吃的蘿蔔種類
        # 要先結算中毒造成的效果
        if p > 0:
            m -= n*p
            if m <= 0:
                print("bye~Rabbit")
                break
        # 再結算進食的效果
        if v == 0:  # 沒吃
            pass
        elif v == 1:  # 紅色
            m += x
        elif v == 2:  # 白色
            m += y
        elif v == 3:  # 黃色
            m -= z
            if m <= 0:
                print("bye~Rabbit")
                break
        elif v == 4:  # 黑色
            m -= w
            p += 1  # 毒素加 1
            if m <= 0:
                print("bye~Rabbit")
                break
    # 如果 m 沒有歸零,輸出 m 的值
    if m > 0:
        print(f"{m:d}g")

使用時間約為 1.1 s,記憶體約為 36.5 MB,通過測試。
import sys

result = []
lines = sys.stdin.readlines()
ptr = 1
while ptr < len(lines):
    # 前 4 項為紅、白、黃、黑蘿蔔對應的體重變化
    # n 為中毒狀態每天減少的體重,m 為體重初始值
    x, y, z, w, n, m = map(int, lines[ptr].split())
    line = lines[ptr+1].strip()  # 每天吃的蘿蔔
    ptr += 2
    if not line:  # 特例,沒有吃蘿蔔,直接輸出原體重
        result.append(f"{m:d}g\n")
        continue
    
    p = 0  # poison  # 累積的毒素
    for v in map(int, line.split()):  # 每天吃的蘿蔔種類
        # 要先結算中毒造成的效果
        if p > 0:
            m -= n*p
            if m <= 0:
                result.append("bye~Rabbit\n")
                break
        # 再結算進食的效果
        if v == 0:  # 沒吃
            pass
        elif v == 1:  # 紅色
            m += x
        elif v == 2:  # 白色
            m += y
        elif v == 3:  # 黃色
            m -= z
            if m <= 0:
                result.append("bye~Rabbit\n")
                break
        elif v == 4:  # 黑色
            m -= w
            p += 1  # 毒素加 1
            if m <= 0:
                result.append("bye~Rabbit\n")
                break
    # 如果 m 沒有歸零,輸出 m 的值
    if m > 0:
        result.append(f"{m:d}g\n")

sys.stdout.write("".join(result))


C++ 程式碼


使用時間約為 0.2 s,記憶體約為 3.4 MB,通過測試。
#include <iostream>
#include <sstream>
using namespace std;

int main() {
    ios::sync_with_stdio(0); cin.tie(0);
    int T;
    cin >> T;
    while(T--) {
        // 前 4 項為紅、白、黃、黑蘿蔔對應的體重變化
        // n 為中毒狀態每天減少的體重,m 為體重初始值
        int x, y, z, w, n, m;
        cin >> x >> y >> z >> w >> n >> m;
        cin.ignore();
        string line;  // 每天吃的蘿蔔
        getline(cin, line);
        if (line.empty()) {  // 特例,沒有吃蘿蔔,直接輸出原體重
            cout << m << "g\n";
            continue;
        }
        
        int p = 0, v;  // 累積的毒素
        stringstream ss (line);
        while(ss >> v) {  // 每天吃的蘿蔔種類
            // 要先結算中毒造成的效果
            if (p > 0) {
                m -= n*p;
                if (m <= 0) {
                    cout << "bye~Rabbit\n";
                    break;
                }
            }
            // 再結算進食的效果
            if (v == 0) {  // 沒吃
                ;
            } else if (v == 1) {  // 紅色
                m += x;
            } else if (v == 2) {  // 白色
                m += y;
            } else if (v == 3) {  // 黃色
                m -= z;
                if (m <= 0) {
                    cout << "bye~Rabbit\n";
                    break;
                }
            } else if (v == 4) {  // 黑色
                m -= w;
                p++;  // 毒素加 1
                if (m <= 0) {
                    cout << "bye~Rabbit\n";
                    break;
                }
            }
        }
        // 如果 m 沒有歸零,輸出 m 的值
        if (m > 0) {
            cout << m << "g\n";
        }
    }
    return 0;
}


沒有留言:

張貼留言