日期:2025年9月1日
ZeroJudge 題目連結:d566. 秒殺率
解題想法
這題要注意:
- 此處的解題紀錄排在前面的資料代表時間越晚
- 第 4 筆測資格式有問題,全部塞在同一行,用 Python 解題需要特別處理這筆測資。
Python 程式碼
理論上這樣寫應該要過關,但是第 4 筆測資格式有問題,全部塞在同一行,要再修改程式碼。
cnt = dict() # 計數器,是否 AC
fir = 0 # 第一次就 AC 的人數
ac = 0 # AC 人數
n = int(input()) # n 筆資料
data = [input().split() for _ in range(n)] # 先讀完所有的資料
for name, state in data[::-1]: # 反向讀取資料,先讀取時間較早的資料
if name not in cnt: # 如果 name 不在 cnt 之中
if state == "AC": # 如果第一次就 AC
fir += 1 # fir 加 1
ac += 1 # ac 加 1
cnt[name] = True # cnt[name] 為 True
else: # 第一次沒有 AC
cnt[name] = False # cnt[name] 為 False
elif not cnt[name] and state == "AC": # 如果之前已上傳答案但沒過,而且這次過了
ac += 1 # ac 加 1
cnt[name] = True # cnt[name] 為 True
print(f"{fir*100//ac:d}%")
使用時間約為 45 ms,記憶體約為 6.2 MB,通過測試。
import sys
cnt = dict() # 計數器,是否第一次就 AC
fir = 0 # 第一次就 AC 的人數
ac = 0 # 全部 AC 的人數
for line in sys.stdin: # 讀資料直到 EOF 為止
data = line.split() # 先試著分割資料
if len(data) == 1: # 如果只有一筆,是 n
n = int(data[0])
data = [input().split() for _ in range(n)] # 先讀完所有的資料
for name, state in data[::-1]: # 反向讀取資料,先讀取時間較早的資料
if name not in cnt: # 如果 name 不在 cnt 之中
if state == "AC": # 如果第一次就 AC
fir += 1 # fir 加 1
ac += 1 # ac 加 1
cnt[name] = True # cnt[name] 為 True
else: # 第一次沒有 AC
cnt[name] = False # cnt[name] 為 False
elif not cnt[name] and state == "AC": # 如果之前已上傳答案但沒過,而且這次過了
ac += 1 # ac 加 1
cnt[name] = True # cnt[name] 為 True
else: # 為了測資 4 全部塞在一行的狀況
n = int(data[0])
for i in range(2*n, 0, -2): # 反向讀取資料,先讀取時間較早的資料
name, state = data[i-1], data[i]
if name not in cnt: # 如果 name 不在 cnt 之中
if state == "AC": # 如果第一次就 AC
fir += 1 # fir 加 1
ac += 1 # ac 加 1
cnt[name] = True # cnt[name] 為 True
else: # 第一次沒有 AC
cnt[name] = False # cnt[name] 為 False
elif not cnt[name] and state == "AC": # 如果之前已上傳答案但沒過,而且這次過了
ac += 1 # ac 加 1
cnt[name] = True # cnt[name] 為 True
print(f"{fir*100//ac:d}%")