📚
AtCoder Beginner Contest 384参加記
トヨタ自動車プログラミングコンテスト2024#12(AtCoder Beginner Contest 384)に参加したので記録を残します。
今回は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(""))
}
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)
}
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)
}
}
D - Repeated Sequence
累積和を使うんだろうとは思いつつわからず。コンテスト時間中に考え続けることはせずにさっさと撤退しました。
感想
累積和の扱いはもうちょっと練習してもいいかもなあ。あと、ビット全探索はテンプレ化している怪しいコードを持ってきましたが、これくらいはサクッと書けるようにしたほうが実装力を鍛えるという意味だといいかも…
Discussion