ABC226の問題を、本番で自分が解けた所までの解説です。
Dまでで1時間切り。このペースを常に安定してアウトプットしたいものです。
Difficulty: 14
小数第三位までで表すことのできる実数が、小数第三位まで入力されます。
を小数第一位で四捨五入した結果として得られる整数を出力してください。
# strとして入力。後で小数点以下の一番左の桁が欲しいため
X = list(map(int,input().split('.')))
# S[1]:小数点以下の数字
# 小数点以下が500未満(=1~4)ならそのまま整数部を出力
if int(X[1]) < 500:
print(X[0])
# そうじゃないなら、整数部に1足したものを出力
else:
print(int(X[0])+1)
# 入力
X=float(input())
# 0.500の時に発生する誤差を木にして、0.001未満の小さな数を足した上でroundしたものを出力
print(int(round(S+0.0005,0)))
from decimal import Decimal,ROUND_HALF_UP
# 入力
X = input()
print(Decimal(X).quantize(Decimal('0'), rounding=ROUND_HALF_UP))
Difficulty: 192
から までの番号がついた 個の数列が与えられます。
数列 は、長さが で 番目の要素が であるような数列です。
数列 と数列 は、 かつすべての に対して が成り立つ時に同じであるとみなします。
同じ数列は 種類として数えるとき、数列 から数列 の中に全部で何種類の数列がありますか?
# 入力、セット用意
N = int(input())
s = set()
# ループ内で配列化せずにstrのままsetに無理やり突っ込んでいく
for i in range(N):
s.add(input())
# 長さ=種類数
print(len(s))
Difficulty: 539
from collections import deque
# 入力
N = int(input())
need_d = dict()
study_time = [0]*(N+1)
# 習得にかかる時間を配列で、習得に必要な技をdictで管理。
for i in range(N):
L = list(map(int, input().split()))
study_time[i+1] = L[0]
need_d[i+1] = set(L[2:])
time = study_time[N]
que = deque()
studied_s = set()
que.append(N)
# BFSと同じように、timeを足していく
while que:
next_waza = que.popleft()
for i in need_d[next_waza]:
if i not in studied_s:
que.append(i)
studied_s.add(i)
time += study_time[i]
print(time)
Difficulty: 706
AtCoder 国は無限に広がる直交座標の上にあります。 AtCoder 国には 個の街があり、 と番号が付けられています。街 は地点 ()にあり、2 つの異なる番号の街が同じ座標にあることはありません。
AtCoder 国には転移魔法(以下、魔法と表記)があります。魔法は整数の組 () によって識別されていて、地点 () にいるときに魔法 () を使うと () にワープすることができます。
すぬけ君は、任意の整数の組 () を選んで魔法 () を覚えることができる大魔術師です。また、すぬけ君は何種類でも魔法を覚えることができます。 魔法を使って街と街の間を移動したくなったすぬけ君は、全ての相異なる街の組 () について次の行動を取れるようにいくつかの魔法を覚えることにしました。
覚えた魔法のうち 種類の魔法のみ を選ぶ。その後、選んだ魔法 のみ を繰り返し使って街 から 街 に移動する。 すぬけ君が上の条件を満たすように魔法を覚えるとき、少なくとも何種類の魔法を覚えればよいですか?
import math
# 入力
N = int(input())
# X,Yをそれぞれ別の配列で管理
X_L = []
Y_L = []
magic_S = set()
for i in range(N):
X, Y = map(int, input().split())
X_L.append(X)
Y_L.append(Y)
# a地点、b地点を全探索
for a in range(N):
for b in range(N):
# 同じ場所から同じ場所ならスキップ
if a == b:
continue
# a地点を(0,0)とした時に、b地点の座標を出す
from_X = X_L[a]
from_Y = Y_L[a]
to_X = X_L[b]
to_Y = Y_L[b]
x = to_X - from_X
y = to_Y - from_Y
# 最大公約数で割る。x,yが0の時にパターン分岐。
if x != 0 and y != 0:
gcd_num = math.gcd(x, y)
x = x // gcd_num
y = y // gcd_num
magic_S.add((x, y))
elif x == 0:
magic_S.add((0, abs(y) / y))
elif y == 0:
magic_S.add((abs(x) / x, 0))
# 魔法の数を数えて終わり!
print(len(magic_S))