🦔

AtCoder Beginner Contest 322参加記(A~C)

2023/10/01に公開

AtCoder Beginner Contest 322に参加したので記録を残します。
https://atcoder.jp/contests/abc322

今回も3完です。

A - First ABC 2

indexOfを使うだけなんですが…
s.indexOf("ABC") >= 0 の部分が s.indexOf("ABC") > 0 になっていてペナりました。やばい。
indexOfを2回呼ぶ必要はもちろんないのですが、テンパっていてこうなりました。

fun main() {
    val n = readln().toInt()
    val s = readln()

    if(s.indexOf("ABC") >= 0) {
        println(s.indexOf("ABC") + 1)
    } else {
        println(-1)
    }
}

https://atcoder.jp/contests/abc322/submissions/46066729

B - Prefix and Suffix

startsWithendsWithで調べます。ssというのは、suffixの略でsにしようと思ったけど、sは既に使っていたのでssになりました。

fun main() {
    val (n, m) = readln().split(" ").map { it.toInt() }
    val s = readln()
    val t = readln()

    val p = t.startsWith(s)
    val ss = t.endsWith(s)

    if(p && ss) {
        println(0)
    } else if(p) {
        println(1)
    } else if(ss) {
        println(2)
    } else {
        println(3)
    }
}

https://atcoder.jp/contests/abc322/submissions/46064573

C - Festival

Aを線形探索だと間に合わない、Aはソート済みということで二分探索が思い浮かびました。
Aiの中にiが存在するのであれば0日目、存在しないのであればその次の値が花火が上がる日ということですね。
存在しない場合は、KotlinのbinarySearch()では戻り値に1を足して符号を反転させると、その要素があったとしたらその位置のはずという値がわかります。これは先週学んだことだったのですが、早速役に立ちました。嬉しい。

import java.io.PrintWriter

fun main() {
    val (n, m) = readln().split(" ").map { it.toInt() }
    val a = readln().split(" ").map { it.toInt() }

    val out = PrintWriter(System.out)

    for(i in 1 .. n) {
        val tmp = a.binarySearch(i)
        val index = if(tmp < 0) {
            -(tmp + 1)
        } else {
            tmp
        }

        println(a[index] - i)
    }

    out.flush()
}

https://atcoder.jp/contests/abc322/submissions/46080027

1からNについて一通り調べます。探索対象はAなので、得られる添字はAの中の添字です。実際には探索する値を起点(0)とした値なので、- iで補正して出力です。

D - Polyomino

なんかやばそうなので飛ばしました。解ける気がしないのと、順位表を見ると解けている人が明らかに少なかったので…

E - Product Development

制約が小さければbit全探索で解けるけど実際には制約が大きくて無理、なのでDPっぽいとは思いましたが、管理したい値(パラメーター)が最大5つなので、まさか5次元DP?もしくは6次元DP??
一応やってみようと思いましたが、5次元だとか6次元だとかだとデータの状態をイメージできなくて全然無理でした。
5次元とかにしないで2次元配列を5つ用意するのではダメなのかなと思ったりもしましたが、個別にDPで求めても得られるのはコストの値だけで、どの開発案を採用したのかはもはやわからなくなっているのでまとめて扱わないとダメでしたね。

解説をチラ見した感じだと2次元DPで解けるようでした。5次元DPとかをイメージできるようになるよりは2次元DPで解けるようになるための考え方を学んだ方がよさそうです。シンプルに興味があるので、そのうち解説ACしようと思います。

感想

Aでペナった時点でもうダメかと思いましたが、Cは比較的(あくまでも比較的)早く解けたので事なきを得ました。(+3)
不甲斐ないですが、まあいつものこととも言えます…

体調が悪いときはABCに出るのが怖いと感じてしまっていましたが、体調が良くなるにつれて、普通にABCに出たいと思えるようになったので良かったです。
あまり精進できてない以上はレートの上昇はあまり期待できないので、とりあえずRated参加できているだけで良いほうかなと思います。
(執筆時間: 31分53秒)

Discussion