LoginSignup
1
2

More than 3 years have passed since last update.

【解説】AtCoder Beginner Contest 196【A~C問題】

Last updated at Posted at 2021-03-20

はじめに

オイイイイイイイイイイイイッス!どうも、歌うプログラマのことり兄貴(・8・)です!
「AtCoder Beginner Contest 196」、お疲れさまでした~
今朝あたりにAtCoderの取材の動画を見て、「そや!ワイもコンテストの風景を録画してみよ!」って思い立ってやってみました!

【実況3完】AtCoder Beginner Contest 196【2021/3/20】
3完でした~

せっかくなので今回から記事とかも書いてみようと思います!
1年後のワイにはD問題とかも余裕で解説してて欲しいな~

あ、今回はPythonで書いてます!

目次

1.A - Difference Max
2.B - Round Down
3.C - Doubled
4.おわりに

1. A - Difference Max

問題

整数a,b,c,dが与えられます。xをa以上b以下,yをc以上d以下になるように選んでx - y を最大化してください。

制約

・-100 <= a,b,c,d <= 100
・a <= b, c <= dであることが保証されている

A問題リンク

ことり兄貴(・8・)の解答(リアタイ)

Python
a, b = map(int, input().split())
c, d = map(int, input().split())
print(b - c)

x - y の差を大きくしたい

xを最大化, yを最小化したい

よって
x = b, y = cとなり、
b - c を出力すればおけです。

2. B - Round Down

問題

整数または小数Xが与えられるので、小数点以下を切り捨てて整数で出力してください。

制約

・0 <= x <= 10の100乗
・X は整数、または小数点以下が100桁以下の小数であり、先頭に余計な0は付かない。

B問題リンク

ことり兄貴(・8・)の解答(リアタイ)

Python
x = input()
t = ''
for a in x:
    if a == '.': break
    t += a

print(t)

まず10の100乗という尋常でない数...w
計算しようとしちゃいけません。
ちなみにワイは最初float型に入れてみて、誤差にビビりました()

小数点以下を切り捨てる = 小数点の直前までを出力
ということなので空文字列tを作り、forループで小数点が出現しない限り
その数字(てか実質文字扱い)をtに追加してみました。

ちなみに、

コードダイエットガチ勢の解答

Python
print(input().split('.')[0])

1行でもいけますw

入力した文字列を小数点で分割

そのうち最初の要素を出力

リアタイで書きたかったなぁ、これw

3. C - Doubled

問題

整数Nが与えられます。
1以上N以下の数のうち、桁数が偶数(先頭に0をつけない)でその前半と後半が
文字列として等しいものはいくつありますか。

制約

・Nは整数
・1 <= N <= 10の12乗

C問題リンク

ことり兄貴(・8・)の解答(リアタイ)

Python ※下に改良版あります。
n = int(input())
i = '1'
ans = 0
while(True):
    if int(i + i) <= n:
        ans += 1
    else:
        break
    i = str(int(i) + 1)

print(ans)

これはちょっと最初「なんだこれは...?」ってなってしまいました。
とりあえず紙にいろいろ書いてみて
「0から100の間には11,22,33...と9コあって...」
「1000~10000の間には1111,1212,1313ってあれ?1010もか」
「あ!!そっか!これシンプルに半分見たときに1,2,3,4...ってなればいいんじゃん!」
といった具合に辿り着きましたw
まさかこんなにシンプルだったとは。圧倒的アハ体験。

iを'1'として宣言

whileループ
iを二つ並べたものを整数としてみたときにn以下であれば答えが1つ増え、
nより大きくなったらループを終了。
といった具合。

提出するときに「TLEならんかな...?」ってちょっと心配だったけど、nが10の12乗だったとしても
最大値は9が6コ並んだやつ = 約10の6乗
とかなので普通に回りきってくれました。

ちなみに、ansを作ってしまいましたが結局それってiなので
※ただしn < 11のときの答えは0なので今回はiを0で宣言

コードダイエットした解答

Python
n = int(input())
i = 0
while int(str(i + 1) * 2) <= n:
    i += 1

print(i)

リアタイではiをstrとして宣言したけど、こっちのほうがスッキリかも~
ついでにwhile文にもかなり無駄があったので修正。

4. おわりに

今回のAからCは、「気付き」と「ひらめき」って感じだったな~
気付けばパッって解けるけど、気付かないと途方もなく感じるやつ...w
筆者はこれまでpaiza.ioをメインのコーディング環境として使っていたのですが、最近PythonでABCの過去問を解き始めるにあたって「せっかくだしコード保存してぇ」ってなってVSCodeに乗り換えました。
使いやすくてええな~!

動画もだけど、こういった記事も将来見たときに「この時の自分はこういう問題をこんな風に解いてたんだ」って感じで見れそうで楽しみなのでぜひ続けてみたい。
この記事を見てる方の参考にもなれば幸いです!!

1
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
2