AtCoder ABC169
2020-05-31(日)に行われたAtCoderBeginnerContest169の問題をA問題から順に考察も踏まえてまとめたものとなります.
前半ではABCまでの問題を扱います.
問題は引用して記載していますが,詳しくはコンテストページの方で確認してください.
コンテストページはこちら
公式解説PDF
A問題 Multiplication 1
問題文
$A×B$を求めてください。
入力を受け取り,掛け算したものを出力しました.
a, b = map(int, input().split())
print(a * b)
B問題 Multiplication 2
問題文
$N$個の整数$A_1,...,A_N$が与えられます。
$A_1×...×A_N$を求めてください。
ただし、結果が$10^{18}$を超える場合は、代わりに"-1"を出力してください。
Pythonで参加していましたが,苦戦しました.
入力の最後に0があったらまずいため,全部の値を掛け算し続けるプログラムを書いて,"TLE"になってました.
最初に0があるかどうか確かめられれば,Pythonであればそんなに苦戦しなくて済んだはずなのですが,予想以上に時間使ってしまったのと,ペナルティが重なってしまいました(反省).
Pythonのint型上限ないから大丈夫だと楽観視していたが,どんどん計算コストが上がることに気づけてなかった.
n = int(input())
a_list = list(map(int, input().split()))
if 0 in a_list:
print(0)
else:
ans = 1
flag = 1
for i in range(0, n):
ans *= int(a_list[i])
if ans > 10 ** 18:
flag = 0
break
if flag == 0:
print(-1)
else:
print(ans)
ちなみにペナ4回も出しました.
C問題 Multiplication 3
問題文
$A×B$の小数点以下を切り捨て、結果を整数として出力してください。
制約
・$0 \leq A \leq 10^{15}$
・$0 \leq B < 10$
・$A$は整数
・$B$は小数第$2$位まで与えられる
小数の計算に誤差が発生することは知っていたので,100倍して整数にすれば,問題なく計算できると思って,入力$B$に対して100倍して計算する方法を提出したのですが"WA"になって絶望してました.
最初に提出した"WA"が返ってきたコード.
a, b = input().split()
a = int(a)
b = int(float(b) * 100)
print(a * b // 100)
何が原因かわからず,いろいろ試行錯誤したのですが,中々通らず,最後は入力$B$をfloatに変換せずに,文字列から三桁の整数として直接,数字列に変換することで"AC"通すことができました.
小数を100倍して整数にするところでも誤差が発生するとは知らなった(例題が問題なく解けたので,原因がまったくわからなかった).
a, b = input().split()
a = int(a)
b = int(''.join(b.split(".")))
x = a * b
print(x // 100)
C問題も"AC"出すまでに4ペナでした.
前半はここまでとなります.
個人的に,苦手な部分の詰め合わせみたいな感じで,A問題のみで終わってrateガタ落ちするのではと焦ってしまったのも,解くのに時間がかかった原因かなと思っています.
本当にコンテスト中は理由がわからず絶望してました(ジャッジ結果も表示方法が告知なく変わっていて,どのくらいの問題が通せているのかすらわからなかったのも原因です).
前半の最後まで読んでいただきありがとうございました.
後半はDEF問題の解説となります.
後半に続く.