這題我是用最直接的寫法,先找出字串 s 中 g, m, k, byte, bit, . 的索引值,再寫很多層的 if, else 判斷 s 的格式,依照格式分割字串、換算答案。
Python 程式碼
使用時間約為 14 ms,記憶體約為 8.6 MB,通過測試。
while True:
try:
s = input()
ans = 0
if "gb" in s:
i = s.find("gb")
a = int(s[:i])
ans = 8*a*10**9
elif "mb" in s:
i = s.find("mb")
a = int(s[:i])
ans = 8*a*10**6
elif "kb" in s:
i = s.find("kb")
if "." in s:
j = s.find(".")
a = int(s[:j])
b = int(s[j+1:i])
ans = 8*(a*10**3 + b*100)
else:
a = int(s[:i])
ans = 8*a*10**3
elif "byte" in s:
i = s.find("byte")
if "." in s:
j = s.find(".")
a = int(s[:j])
b = int(s[j+1:i])
ans = 8*a + b
else:
ans = 8*int(s[:i])
elif "bit" in s:
i = s.find("bit")
ans = int(s[:i])
elif "g" in s and "m" in s and "k" in s:
i = s.find("g")
j = s.find("m")
k = s.find("k")
a = int(s[:i])
b = int(s[i+1:j])
c = int(s[j+1:k])
ans = 8*(a*10**9 + b*10**6 + c*10**3)
elif "g" in s and "m" in s:
i = s.find("g")
j = s.find("m")
a = int(s[:i])
b = int(s[i+1:j])
ans = 8*(a*10**9 + b*10**6)
elif "m" in s and "k" in s:
i = s.find("m")
j = s.find("k")
a = int(s[:i])
b = int(s[i+1:j])
ans = 8*(a*10**6 + b*10**3)
print(ans)
except EOFError:
break
單純的 stack 操作,在 Python 解題可以直接用 list 模擬 stack,在 C++ 建議引入 stack 或 deque 函式庫。
Python 程式碼
使用時間約為 18 ms,記憶體約為 8.4 MB,通過測試。
st = []
n = int(input())
for _ in range(n):
line = input().split()
if line[0] == '1':
if st: st.pop()
elif line[0] == '2':
if st: print(st[-1])
elif line[0] == '3':
st.append(int(line[1]))
C++ 程式碼
使用時間約為 1 ms,記憶體約為 3 MB,通過測試。
#include <cstdio>
#include <stack>
using namespace std;
int main() {
stack<int> st;
int n, op, x;
scanf("%d", &n);
for(int i=0; i<n; i++) {
scanf("%d", &op);
if (op == 1) {
if (!st.empty()) st.pop();
} else if (op == 2) {
if (!st.empty()) printf("%d\n", st.top());
} else if (op == 3) {
scanf("%d", &x);
st.push(x);
}
}
return 0;
}
def find_k(a, b):
if a == b:
return 1
if a > b:
return 2 * find_k(a-b, b)
else:
return find_k(b, a) + 1
def solve():
import sys
result = []
data = sys.stdin.read().split()
ptr = 0
while ptr < len(data):
x = int(data[ptr])
y = int(data[ptr+1])
ptr += 2
result.append(f"{find_k(x, y):d}\n")
sys.stdout.write("".join(result))
if __name__ == "__main__":
solve()
使用時間約為 14 ms,記憶體約為 8.4 MB,通過測試。
def find_k(a, b):
if a == b:
return 1
if a > b:
return 2 * find_k(a-b, b)
else:
return find_k(b, a) + 1
def solve():
import sys
data = sys.stdin.read().split()
ptr = 0
while ptr < len(data):
x = int(data[ptr])
y = int(data[ptr+1])
ptr += 2
print(find_k(x, y))
if __name__ == "__main__":
solve()
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")
用最小優先佇列 pq 儲存數字,每次取出其中最小的兩個數字 a、b,a、b 相加為 c,更新成本 cost 之後再將 c 存回 pq,直到 pq 之中只剩下一個數字為止。如果用 C++ 解題要用 long long 儲存答案,用 int 會溢位。
Python 程式碼
使用時間約為 99 ms,記憶體約為 13.6 MB,通過測試。
def solve():
import sys, heapq
result = []
data = sys.stdin.read().split()
ptr = 0
while ptr < len(data):
n = int(data[ptr])
ptr += 1
if n == 0: break
pq = []
for _ in range(n):
x = int(data[ptr])
ptr += 1
heapq.heappush(pq, x)
cost = 0
while len(pq) >= 2:
a = heapq.heappop(pq)
b = heapq.heappop(pq)
c = a + b
cost += c
heapq.heappush(pq, c)
result.append(f"{cost:d}\n")
sys.stdout.write("".join(result))
if __name__ == "__main__":
solve()
t = int(input()) # t 筆測資
for _ in range(t): # 執行 t 次
n = int(input()) # n 片雪花
snowflake = [int(input()) for _ in range(n)] # 讀取雪花編號
last = dict() # 每一個編號的雪花上次出現的索引值
imax = 0 # 不同編號雪花數量最大值
left = 0 # 滑動視窗左端點
for right, snow in enumerate(snowflake): # 依序讀取雪花編號
if snow in last and last[snow] >= left: # 如果 snow 在 last 之中,而且索引值大於等於左端點
left = last[snow] + 1 # 更新左端點為目前雪花編號前一次出現的索引值加 1
last[snow] = right # 更新目前雪花編號出現的索引值為 right
imax = max(imax, right - left + 1) # 更新最大值
print(imax)
def solve():
import sys
result = []
data = sys.stdin.read().split()
ptr = 1
while ptr < len(data):
n = int(data[ptr]) # n 片雪花
ptr += 1
last = dict() # 每一個編號的雪花上次出現的索引值
imax = 0 # 不同編號雪花數量最大值
left = 0 # 滑動視窗左端點
for right in range(n): # 依序讀取雪花編號
snow = data[ptr]
ptr += 1
if snow in last and last[snow] >= left: # 如果 snow 在 last 之中,而且索引值大於等於左端點
left = last[snow] + 1 # 更新左端點為目前雪花編號前一次出現的索引值加 1
last[snow] = right # 更新目前雪花編號出現的索引值為 right
val = right - left + 1 # 更新最大值
if val > imax: imax = val
#imax = max(imax, right - left + 1)
result.append(f"{imax:d}\n")
sys.stdout.write("".join(result))
if __name__ == "__main__":
solve()