0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

茶色コーダーによるABC383振り返り

Posted at

初めに

あー雪降ってる。
いよいよ冬だな
明日は-4度寒い(おい 二次予選当日だからって、現実逃避するな)

あーあwebの情報をもうちょっと、ちゃんと見てたら4完したんだけどなー
結果としては、aは瞬殺
bは実装に戸惑いつつも12分ぐらいでAC
cはJOIの過去問に部分問題として同じようなのが出てきたので、それを使ってacしました
dはまあネットの情報を見落としてacできませんでした。(あのアホミス集の記事フラグだったか)

さて本題

使っているライブラリ
前回同様まだahcが開催中のため、更新していません
github
あと今回あまり問題文を要約するところがないため、要約はしません。

A問題

普通に現在の時間と、水量を取っておいて
各動作ごとに、たった時間を水量から引けばOK

acコード(ライブラリ抜粋)

# コード
N = ii()
L = li(N, il)

current = 0
w = 0

for t, v in L:
    w = max(0, w - abs(t - current))
    w += v
    current = t

print(w)

B問題

全探索して解いた
具体的には、加湿されているマスのbool状態を取っておけばいいためフラグ変数を置く
そしてiとjを全探索して条件を満たすマスを探します。条件を満たしているマスはboolをtrueにします
そうすればあとは立っているフラグの最大値を求めればいいです(言語化能力低すぎだろ)

acコード(ライブラリ抜粋)
クソコードですいません

H, W, D = il()
S = li(H, s)
ans = 0
for ai in range(H):
    for ak in range(W):
        for bi in range(H):
            for bk in range(W):
                if ai == bi and ak == bk:
                    continue

                if S[ai][ak] == "#" or S[bi][bk] == "#":
                    continue

                used = [[False] * W for _ in [0] * H]
                used[ai][ak] = True
                used[bi][bk] = True

                for i in range(H):
                    for k in range(W):
                        if abs(ai - i) + abs(ak - k) <= D and S[i][k] == ".":
                            used[i][k] = True

                for i in range(H):
                    for k in range(W):
                        if abs(bi - i) + abs(bk - k) <= D and S[i][k] == ".":
                            used[i][k] = True

                ans = max(ans, sum([l.count(True) for l in used]))

print(ans)

C問題

この問題、JOIの過去問のゾンビ島に出てくる 部分問題と同じだと、確信して実装したらACした
具体的には、キューにマスの状態と加湿器から何マス目かという情報を入れてbfsすればいいです
であとは通ったマスのカウントの数を出力すればOKです

b問題を提出してから7分ぐらいでacしました
acコード(ライブラリ抜粋)

MOVES = [(1, 0), (-1, 0), (0, 1), (0, -1)]
H, W, D = il()
S = li(H, s)

used = [[False] * W for _ in [0] * H]

Q = deque()

for i in range(H):
    for k in range(W):
        if S[i][k] == "H":
            used[i][k] = True
            Q.append((i, k, 0))

while Q:
    x, y, t = Q.popleft()

    if t >= D:
        continue

    for mx, my in MOVES:
        nx, ny = mx + x, my + y

        if not (0 <= nx < H and 0 <= ny < W):
            continue

        if S[nx][ny] != ".":
            continue

        if used[nx][ny]:
            continue

        Q.append((nx, ny, t + 1))
        used[nx][ny] = True

print(sum([l.count(True) for l in used]))

D問題

色々調べたながれ、約数を9個持つ数とググる。
調べてみると知恵袋に大量にある、えーと2つの素数($p<q$を満たしている)をどちらも2乗して、それをかけた数が$N$以下だったら条件を満たすのかー
エラトステネスの篩で$\sqrt N$以下の素数を列挙して、二分探索使えばいいじゃないかと思い、書いてテストするとACできないなんでだろう。
えーとミスりました$p^8$が$N$以下も条件を満たすのです。
それを書き忘れたからもちろんACできません

後で解説見たら調べたyoutubeで、そんなこと言ってたなと思いました
それで4完の絶好の機会を逃しました

終わり

いつもより内容スカスカで、すいません
JOI二次予選頑張ります
レートは30上がって、緑まで、残り110です。

追記:この記事を書き終わった頃には雪はやみました(しょうもな)
以上

0
0
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
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?