早稲田卒のAI研究者のブログ

データサイエンス、機械学習、競技プログラミング、音楽、勉強

AtCoder Beginner Contest 144に参加しました

atcoder.jp




題名の通り、AtCoder Beginner Contest 144に参加した備忘録。

はじめに

今回のABCでは、A, B, C, D問題の4完でした。

茶色コーダーである僕の今の目標は4完なので、ホッとしています。

ですが、D問題であるミスに気づけず、数回エラーを出してしまったため、順位はあまり芳しくありませんでした。

また、E問題にも挑戦しましたが、解けそうで解けませんでした。
思考の指針はいい線行ってると思ったんですけどね。
いずれ解いて、本ブログの記事にしたいと思います。

ABC144の難易度

今回の正答率データは
A問題:99%
B問題:98%
C問題:83%
D問題:84%
E問題:64%
F問題:50%
でした。

前回と比較すると、C問題が難化し、D問題以降が易化していますね。

正直、今回のD問題はアルゴリズムの問題ではなく、高校数学でした。
そのため、解ける人が多かったのでしょう。

また、E問題も僕がいい線行くくらいなので、いつもより簡単なことがわかります。
(普段はほぼ確実に解けない)

E問題の正答率が64%っていうのはかなり高いですよね。

各問題における僕の解答

A問題

atcoder.jp



A問題は単純です。
AとBが10より大きいかで場合分けをするだけです。
桁数って言葉に惑わされると、少し悩むかも。
以下僕の実装。

A, B = map(int, input().split())
if A >= 10 or B >= 10:
    print(-1)
else:
    print(A * B)

B問題

atcoder.jp


A問題と似た問題で作者の遊び心を感じました。

これまた簡単で、2重のfor文で、全通り計算するだけです。
ちなみに僕は1度エラーを叩き出しました。

以下僕の実装

N = int(input())
ans = "No"
for i in range(1, 10):
    for j in range(1, 10):
        if N == i * j:
            ans = "Yes"
print(ans)

C問題

atcoder.jp

すこし考える問題ですね。
といっても簡単です。
問題文が幅優先探索っぽいので、それに取り憑かれてしまうとハマってしまうはずです。
実は小難しいアルゴリズムは必要なく、約数の組の中で最も和が小さいものを見つける問題でした。

以下僕の実装。

N = int(input())

for i in range(int(N ** 0.5), 0, -1):
    if N % i == 0:
        x = i
        y = N // i
        break
print(x+y-2)

D問題

atcoder.jp


思いっきり高校数学です。
問題を見た瞬間、図を書き、ゴリゴリ計算しました。
大学受験を思い出して楽しかったです。

ですが、提出の際、かなりエラーを出してしまいました。
その原因は、「もともと水筒が水で満タンの時」を考慮していなかったからです。

1回目のエラーのあと、浮動小数の誤差がなにか影響したのだと決めつけ、水筒が水で満タンのときに気がつくのが遅れてしまいました。

反省。

以下のコードで、

if ((a**2) * b) / 2 - x == 0:

とせずに、

if abs(((a**2) * b) / 2 - x) < 1e-2:

としていることからも浮動小数の誤差の影響を気にしているのがわかりますね。


以下僕の実装。

import math
a, b, x = map(int, input().split())

if abs(((a**2) * b) / 2 - x) < 1e-2:
    print(45)
elif ((a**2) * b) == x:
    print(0)
elif ((a**2) * b) / 2 < x:
    atan = math.degrees(math.atan((a**3)/(2*b*(a**2) - 2*x)))
    print(90-atan)
else:
    atan = math.degrees(math.atan((2*x)/(a*(b**2))))
    print(90-atan)

最後に

少し反省点はありましたが、無事4完できたので安心しました。
今後も、コンスタントにコードを書いて、日々atcoderの準備をしていきたいと思います。