書き直し
標準のデータ構造でALDS1_3_A、ALDS1_3_B、ALDS1_3_Cを書き直しました
すっきり
ALDS1_3_A
(pythonの)リストとappend
、pop
を使いました
#! /usr/local/bin/python3
# coding: utf-8
def stack_op2(s, op):
v2 = s.pop()
v1 = s.pop()
s.append(op(v1, v2))
def calc(terms):
s = []
for t in terms:
if t == "+":
stack_op2(s, lambda v1, v2: v1 + v2)
elif t == "-":
stack_op2(s, lambda v1, v2: v1 - v2)
elif t == "*":
stack_op2(s, lambda v1, v2: v1 * v2)
else:
s.append(int(t))
return s.pop()
print(calc(input().split()))
ALDS1_3_B
deque
でappendleft
とpop
を使いました
#! /usr/local/bin/python3
# coding: utf-8
from collections import deque
def main():
n, q = [int(x) for x in input().split()]
proc = deque()
for i in range(n):
name, ptime = input().split()
proc.appendleft((name, int(ptime)))
time = 0
while proc:
name, ptime = proc.pop()
time += min(q, ptime)
ptime -= min(q, ptime)
if ptime <= 0:
print(name, time)
else:
proc.appendleft((name, ptime))
main()
ALDS1_3_C
deque
でappendleft
、remove
、pop
、popleft
を使いました
remove
は対象がないとExceptionなので無視してやる必要がありました
#! /usr/local/bin/python3
# coding: utf-8
from sys import stdin
from collections import deque
def main():
n = int(input())
dll = deque()
for _ in range(n):
line = stdin.readline().split()
if line[0] == "insert":
dll.appendleft(int(line[1]))
elif line[0] == "delete":
try:
dll.remove(int(line[1]))
except ValueError:
None
elif line[0] == "deleteFirst":
dll.popleft()
elif line[0] == "deleteLast":
dll.pop()
print((" ".join(map(str, dll))))
main()
200万件の実行結果 01.80 s
ってめっちゃ速え!
自前の双方向リストだと 04.98 s
自分で書いちゃだめですね