くろたんく雑記帳

日常とか、わんちゃんとか、機械学習とか、競プロとか、

MENU

AtCoder Beginner Contest 185 参加ログ・感想

意味不明なやり方して頭大混乱で、絶対に落としちゃいけないCを落としてしまった・・・


内容

  • Python3でやっている。
  • 参加ログ。
  • 所感。
  • コンテスト中に何を考えたか。
  • コンテスト後に解説をみたり、少し整理したりしたくらいの内容。
  • 問題の詳細で細かく書こうと思うものは別記事とする。

結果

AB完。Cはただのコンビネーションでとにかく11箇所を選ぶだけの計算だったのにわけわからんこと考えて終了なぜパニクるのかもよくわからんし、さらにPythonならオーバーフロー気にせずできる。Dは、マスのリストをソートして、差分を取って、一番小さい値で差分を割って切り上げを足すだけ。あとから考えると結構ラッキー回だったのにできなかったのは実力不足Orz


どう考えたか + α

問題

A - ABC Preparation

問題タイプ:最小値

文意から問題数が最も小さい値が答え。

a = [int(x) for x in input().split()]
ans = min(a)
print(ans)

B - Smartphone Addiction

問題タイプ:クエリ処理・条件分岐 初期に持っているバッテリー値{\displaystyle n}に対して、

  • 以降の変化するバッテリー値{\displaystyle bat} とする。
  • {\displaystyle a} - 前回の{\displaystyle b}の値({\displaystyle \_b})を引く。(状況:歩いている時間)
    • 初回は{\displaystyle a}を引く。
    • この時に{\displaystyle bat \leq 0} になったら'No'
  • {\displaystyle b - a}を足す。(状況:カフェで充電)
    • この時に{\displaystyle bat \gt n} になったら{\displaystyle bat = n}とする。(状況:満充電)
  • 次のクエリの{\displaystyle a}と引き算するために{\displaystyle b}を保持しておく。(状況:カフェ出た時間の保持)

なんか、結構条件をきちんと書き上げるだけなんだけど、条件分岐も多くて結構ハマった。

n, m, t = map(int, input().split())
ab = [list(map(int, input().split())) for _ in range(m)]
_b = 0
bat = n 
for a, b in ab:
    _a = a - _b
    _b = b - a 
    bat -=  _a
    if bat <= 0:
        print('No')
        exit()
    bat += _b
    if bat > n:
        bat = n
    _b = b
if t - _b < bat:
    print('Yes')
else:
    print('No')

C - Duodecim Ferra

問題タイプ:組み合わせの数え上げ

文意から、とにかく{\displaystyle 11}箇所切るところを選ぶ選び方。つまり{\displaystyle _{L-1}C_{11}} Pythonの場合はオーバーフローは気にせず。分子と分母を別々に計算して割り算するだけ。

l = int(input())
# l-1から11を選ぶ選び方    
a, b = 1, 1
for i in range(1, 12):
    # 分子
    a *= l-i
    # 分母
    b *= i
print(a//b) 

おわりに

今回は、絶対わからんっていう感じでもなかったのに、解ききれないといった感じ。またRatingは少し下がってしまった。沼はまだ深い・・・。


参考になる書籍

けんちょんさんこと、大槻さんの書籍である、「問題解決力を鍛える!アルゴリズムとデータ構造」 ご本人の記事の中で難易度は、螺旋本ということで初学者でも非常に結構読みやすい!!!(実際に、けんちょんさんの記事はC++に疎い自分でも、その思考プロセスを学べるくらい丁寧に書かれているし、この書籍も非常に読みやすい)どのようなステータスの人にもおすすめの一冊になっている。

7章までPythonで章末問題をこなしていっている。

blacktanktop.hatenablog.com