🎃

AtCoder Beginner Contest 364参加記

2024/07/28に公開

日本レジストリサービス(JPRS)プログラミングコンテスト2024#2(AtCoder Beginner Contest 364)に参加したので記録を残します。
https://atcoder.jp/contests/abc364

ちょっと間が空いてしまって、なんとなく自信がなくてUnrated参加としました。3完でしたが、Dが難しかったのかRatedにしていたらかなり良いパフォーマンスになっていたっぽいです。

A - Glutton Takahashi

先頭からN-1まで見て、sweetが連続するかどうか見ました。連続する箇所があってもそれが末尾ならOKとする必要があります。そういう意味だとN-2まで見るのでもよかったかも。

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

    for(i in 0 until n - 1) {
        if(s[i] == "sweet" && s[i+1] == "sweet") {
            if(i == n - 2) {
                println("Yes")
            } else {
                println("No")
            }

            return
        }
    }

    println("Yes")
}

https://atcoder.jp/contests/abc364/submissions/55999702

B - Grid Walk

問題文の通りシミュレーションします。グリッドは苦手意識が強いですが、このくらいの難易度であれば問題なかったです。

今回は1-indexedに補正してやってみました。

fun main() {
    val (h, w) = readln().split(" ").map { it.toInt() }
    val (si, sj) = readln().split(" ").map { it.toInt() }

    val c = listOf("") + List(h) {
        "." + readln()
    }
    val x = readln()

    var ci = si
    var cj = sj

    for(xc in x) {
        val (di, dj) = resolveDest(xc)
        val i = ci + di
        val j = cj + dj

        if(i !in 1..h || j !in 1..w) {
            continue
        }

        if(c[i][j] == '#') {
            continue
        }

        ci = i
        cj = j
    }

    println("$ci $cj")
}

fun resolveDest(x: Char): Pair<Int, Int> {
    return  when(x) {
        'L' -> 0 to -1
        'R' -> 0 to 1
        'U' -> -1 to 0
        'D' -> 1 to 0
        else -> -1 to -1
    }
}

https://atcoder.jp/contests/abc364/submissions/56010570

C - Minimum Glutton

甘さとしょっぱさは独立して考えることができます。最小にするには甘さ(or しょっぱさ)が大きいのを優先して食べていけばいいはずなので、降順ソートしてから合計値が閾値を超えるまで見ていきます。それを甘さとちょっぱさの両方でやって、小さい方が答えとなります。

import kotlin.math.min

fun main() {
    val (n, x, y) = readln().split(" ").map { it.toLong() }
    val a = readln().split(" ").map { it.toLong() }
    val b = readln().split(" ").map { it.toLong() }

    val ab = a.zip(b)

    val sorted1 = ab.sortedByDescending { it.first }
    var current = 0L
    var count1 = 0
    for(i in 0 until n.toInt()) {
        current += sorted1[i].first
        count1++
        if(current > x) {
            break
        }
    }

    val sorted2 = ab.sortedByDescending { it.second }
    current = 0L
    var count2 = 0
    for(i in 0 until n.toInt()) {
        current += sorted2[i].second
        count2++
        if(current > y) {
            break
        }
    }

    val ans = min(count1, count2)
    println(ans)
}

https://atcoder.jp/contests/abc364/submissions/56017743

なんでわざわざPairにしたのか… 混乱してますね。

D - K-th Nearest

事前にデータ構造を作っておくとかは難しそうで、二分探索とかじゃね?(適当)と思ってましたが解けず。実際、二分探索で解けるようです。判定問題を真面目に考えればよかったのか。

感想

二週続けて参加できなかったので、すごく久しぶりのように感じてしまいました。前回の参加時の結果が惨憺たるものだったのもあって、Rated参加する勇気が出ず。なんなら参加自体見送ろうか迷ったのですが、悪くない結果になったのでUnratedでも参加してよかったです。多少はやる気が戻りました。

まあ… 実力が上がったわけではなくて偶発的に良い結果が出ただけなので、前回みたいな爆死は今後もあるんでしょうけどね。そうなってもモチベを保てるメンタルがほしい…

まだやめたくはないので、できる範囲で頑張っていきます。
(執筆時間: 19分48秒)

Discussion