Toy と帽子と ADP BE

主にプログラミングに関わる話をゆるくエモくやっていきます

AtCoder Beginner Contest 182

各問題

A - twiblr

算数。2 * A + 100 - Bですね。

B - Almost GCD

NとMがそう大きくないので、全探索でOKです。実際にAの要素を2から1000までの数で割って割り切れた数を数えます。

C - To 3

まずはNが3で割れるかどうか確認します。割りきれたら答えは0です。

1か2があまりで出た場合はいくつか削る必要があります。ここで3の倍数の判定は各桁の和が3の倍数になっていることで可能であることを利用します。

あまりが1だった場合、各桁の数のうちで単体であまりが1のものを削ればよいので、それがあれば答えは1です。ない場合、2を2つ削ればよいので、それがあれば答えは2です。どちらもできなければ答えは-1です。

あまりが2だった場合も同じように考えて、単体であまりが2のものが1つか、あまりが1のものが2つあればよいです。

ただし、サンプルの最後にあったように2つ削らなければならないケースで桁数が2しかないと数字が全てなくなってしまうのでだめです。サンプル優しいなーと思って提出すると、WA。1つ削らなければならないケースで桁数が1でも数字が全てなくなってしまうことを失念していました。(おばか

D - Wandering

累積和を取り、累積和の累積和を取ります。

累積和の累積和は、i番目まで全て足し終えたときの和が入ります。i番目まで足した時点での最大値は(i - 1)番目の累積和の累積和とi番目までの累積和の中での最大値を足したものです。

それを全部見ていって、最大のものが答えになります。

言葉にすると何言ってんのかわかりませんが、実装するとこんな感じです。

    // sumが累積和で、sum2が累積和の累積和
    ll ans = 0;
    ll peak = 0;
    REP(i, n) {
        chmax(peak, sum[i + 1]);
        chmax(ans, sum2[i] + peak);
    }

E - Akari

問題見た瞬間

atcoder.jp

これを思い出しました。(最近復習したばかりでした。)

縦と横に分けて走査していって実際に照らされるところを特定していけばOK(もうちょっと具体的にいうと、壁と壁の間に電球があればそこを塗りつぶすイメージ、直近の壁の座標は記憶しておけば楽)です。

LampはDなのになんで今回これがE出でるんだろう?とちょっと思いました。

F - Valid payments

おそらく答えはそんなに大きくならないというのは直感的にもサンプルからも明らかなのですが、大きい硬貨+端数を払うときの払い方とかどう求めていいのかわかりませんでした。

まとめ

Eが復習の効果もあって割と早く解けたことが大きく、ギリギリ青パフォに届きました。復習大事!!

f:id:mdstoy:20201108225648p:plain