ABC169
https://gyazo.com/c45957b57b9fd8bbafee4aa4889ef723
https://gyazo.com/7150d3b2514d00f039c5c8a57b3b23a7
はじめてAtcoderのコンテストに参加した
タスクランナーがうまく動かなくて焦った
コンテスト中のページ構造がコンテスト後と異なる or 169回からページ構造が変わった が原因だと思うけど確認できてない
問題はA、B、Cまで解けた
Cは、一発で通ると思ったけど通らなかった
Dができなかったのが悔しい。後日、落ち着いて解いてみる
B
逆順にソート
最後の要素が0なら、0
計算結果が10^18を超えたら-1
それ以外は積
ref
Bは正しく解いてくれれば行けるけど、正しく解くのが難しい感じ。
・0があったら何があろうと0
・掛け算して10^18を越えたら-1
・それ以外は掛け算結果を出力
を上の順番の優先度で正確にやらないと正解出来ない。Bの中ではめちゃめちゃ難しいよね。
特に2番目の判定がむずかしい。
ああー、B問題、「ソートすると0判定が最初に来る」はめちゃめちゃ賢い。なるほどなあ!!
ソートするのは筋がいいなーと思うけど、普通に0があるかを調べる関数かなんか使うのが安定の解き方かな、って気はする。どっちも賢い。
Pythonだとall()で判定できたか。
C
通らなかったコード
code:py
import math
import sys
read = sys.stdin.buffer.read
A, B = map(float, read().split())
answer = math.floor(A * B)
print(answer)
通ったコード
code:py
from decimal import Decimal
import math
A, B = input().split()
answer = math.floor(Decimal(A) * Decimal(B))
print(answer)
誤差の問題くらいしか原因が浮かばなくて「Decimal」使ってみたら通った
「すべての提出」を確認したところ、Decimal使ってる回答例はあまりなさそうだった
ref
C問題は本当に「情報科学をちゃんと理解していますか?」って感じの問題。
64bit整数は、64bit分整数の情報が詰め込まれてるんだけど、double型などの倍精度浮動小数点数だと、符号に1bit、指数を表すのに11bitで、整数情報は残りの52bitしか残されない。なのでこの問題の答えを正確に計算できない(続
これをどう回避するかと言うと、Bを100倍して整数にしてあげて、その後A*Bをし、最後に100を割る、という手順を踏む必要がある。
Bを100倍する際にも誤差が発生する場合があるので注意!
.で切り分けて整数演算するか、微小な数を足して切り捨てるかの2択でうまく行きます。
https://gyazo.com/b156680ad7498d3ee0e55613d847d57c