📚

AtCoder Beginner Contest 384参加記

2024/12/15に公開

トヨタ自動車プログラミングコンテスト2024#12(AtCoder Beginner Contest 384)に参加したので記録を残します。
https://atcoder.jp/contests/abc384

今回は3完、ちょっと負けです。

A - aaaadaa

一行に数値と文字の入力が混在するとめんどくさい…
入力を受け取ったらあとはやるだけですね。

fun main() {
    val input = readln().split(" ")
    val n = input[0].toInt()
    val c1 = input[1].first()
    val c2 = input[2].first()
    val s = readln()

    println(s.map { if(it == c1) c1 else c2 }.joinToString(""))
}

https://atcoder.jp/contests/abc384/submissions/60721419

B - ARC Division

標準的なB問題かな。レートが変動する様子をシミュレーションします。条件分岐はたぶんもっと簡略化できますが、提出の早さを優先して愚直にやっています。

fun main() {
    val (n, r) = readln().split(" ").map { it.toInt() }
    val da = List(n) {
        val (d, a) = readln().split(" ").map { it.toInt() }
        d to a
    }

    var t = r
    for((d, a) in da) {
        if(d == 1) {
            if(t in 1600..2799) {
                t += a
            }
        } else {
            if(t in 1200 ..2399) {
                t += a
            }
        }
    }
    println(t)
}

https://atcoder.jp/contests/abc384/submissions/60727093

C - Perfect Standings

参加者の名前と点数はビット全探索で列挙できます。名前と点数をマッピングしたらあとはソートして出力です。点数が同じ場合は名前の昇順でソートするので、第二ソート条件を指定するためにsortedWithを使います。sortedWithの使い方は微妙に覚えてなくて毎回調べています…

まあsortedWith自体はただComparatorを渡すだけなので、むしろcompareByDescendingとかがすっと出てこないという話なのか。

fun main() {
    val (a, b, c, d, e) = readln().split(" ").map { it.toInt() }

    val s = "ABCDE"

    val map = mapOf(
        'A' to a,
        'B' to b,
        'C' to c,
        'D' to d,
        'E' to e,
    )

    val list = mutableListOf<Pair<String, Int>>()

    bitmask(5) {
        val name = s.zip(it).filter { it.second == '1' }.map { it.first }.joinToString("")
        val score = s.zip(it).filter { it.second == '1' }.map { map[it.first]!! }.sum()

        list.add(name to score)
    }

    list.filter { it.first.isNotEmpty() }
        .sortedWith(compareByDescending<Pair<String, Int>> {it.second}.thenBy { it.first })
        .forEach {
        println(it.first)
    }
}

fun bitmask(n: Int, action: (String) -> Unit) {
    val limit = 1 shl n
    for(i in 0 until limit) {
        val bits = i.toString(2).padStart(n, '0')
        action(bits)
    }
}

https://atcoder.jp/contests/abc384/submissions/60739193

D - Repeated Sequence

累積和を使うんだろうとは思いつつわからず。コンテスト時間中に考え続けることはせずにさっさと撤退しました。

感想

累積和の扱いはもうちょっと練習してもいいかもなあ。あと、ビット全探索はテンプレ化している怪しいコードを持ってきましたが、これくらいはサクッと書けるようにしたほうが実装力を鍛えるという意味だといいかも…

Discussion