それでは毛玉諸君、これにて失敬

日々の精進を備忘録的に綴ります。

ABC165

五本指ソックスばかり履いてます。

ko_ya346です。

ABC165をに挑戦したのでその記録です。

というのも、先日行われたABC171の結果が振るわず(ABDの3完)、原因を色々考えたのですが、

①精進に対する集中力が足りない

②古い問題ばっかり解いてた

の2点が大きいかなと思いました(数学センスが足りないことを除く)。

というわけでABC165が不参加だったため手付かずで残っていたので、バチャ形式で挑戦してみました。

感想

このセットむずくね?

A問題でfor文使うの久しぶりだわ。

A問題

atcoder.jp

range(a, b+1)をfor文で回し、Kの倍数があるかチェック

K = int(input())
a,b=map(int, input().split())

f = 0
for i in range(a, b+1):
    if ((i)%K ==0):
        f = 1

if f:
    print("OK")
else:
    print("NG")

B問題

atcoder.jp

小数でそのまま扱うと誤差が発生する場合があるので変換する

バチャ中には最後のケースが通せませんでした。小数の扱いはまだ慣れない…

maspyさんのコードがすごく参考になりました。

年数をitertools.countで数えている点がオシャレ

maspypy.com

C問題

かなりの何問。水色diff近くあります。

制約を見て全ての配列Aを全探索することを考えました。

9乗ループ(!?)で通しましたが、itertools.combinations_with_replacementを使用するのがスマートな解法です。コンテスト後に存在を知りました。

競プロを通して新しい知識を得る瞬間が一番楽しいですね!脳汁ドバドバ出ました!

from itertools import combinations_with_replacement

N, M, Q = map(int, input().split())

A = [list(map(int, input().split())) for _ in range(Q)]

ans = 0
for i in combinations_with_replacement(range(1, M+1), N):
    tmp = 0
    for a, b, c, d in A:
        if i[b-1] - i[a-1] == c:
            tmp += d
    ans = max(ans, tmp)
print(ans)

D問題

atcoder.jp

最近はD問題に数学知識が要求される問題が多いように感じます。

基本的に過去問を解くだけでは不十分で、その性質をきちんと理解し、正しく式変形できることが求められています。

僕が一番苦手なタイプの問題です…バチャ中も解けませんでした。

解説放送でめちゃ丁寧に式変形について説明があるので、そちらを参考にした方がよいです(ただの手抜き)。すぬけさんいつもありがとうございます。。。

from math import floor

a, b, n = map(int, input().split())
# a, b, n = 10, 8, 10

num = min(b-1, n)
#n以下で最大のbの倍数
print(floor(a*num/b) - a*floor(num/b))

E問題以降はさらっと解説読んだだけで実装まではしていないです。

感想

短時間で集中して取り組めたのでバチャの効率は良さそうに感じます。

また、最近の傾向の問題に触れて自分に足りないスキルが浮き彫りになって良かったです。

早く緑になれるように頑張ります!グリーングリーン。あ、間違えちゃった…。わたし、まだ新米なのよ。