日期: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;
}
沒有留言:
張貼留言