💬

AtCoder Beginner Contest 361参加記

2024/07/07に公開

デンソークリエイトプログラミングコンテスト2024(AtCoder Beginner Contest 361)に参加したので記録を残します。
https://atcoder.jp/contests/abc361

今回は1完です。やばい

A - Insert

微妙にめんどくさい。あまり普段やらない操作なので、メソッドの仕様で混乱しました。第一引数が位置なのね。

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

    a.add( k, x)

    println(a.joinToString(" "))
}

https://atcoder.jp/contests/abc361/submissions/55254265

B - Intersection of Cuboids

全然わかりません。各頂点の座標を求めることはできそうで、頂点がどれか一つでももう一方に含まれるならYes、ということまでは考えましたが、そもそも三次元の状態をイメージできないので実装できる気がしませんでした。

C - Make Them Narrow

Bは解けないことを早々に確信できたのでまだよかったですが、Cは解けそうで解けないので悲しかった。

残した順序を保ってというのは、最小値と最大値以外は使わないので無視してソートしていいというのはわかりました。まずはソートしてから貪欲に操作してみることを考えました。結果に影響があるのは最小値か最大値のどちらかだけなので、どちらを取り除いたほうが答えが小さくなるか見て削除していくという方針です。ただ、これだとどちらを取り除いてもその時点の答えが変わらない場合に詰みます。

しかしそれ以上の考察が進まず。これはダメな流れだと思って、残念ながらその通りになりました。

解説を見て書いたのがこちら。

import kotlin.math.min

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

    var ans = Int.MAX_VALUE
    for(i in 0 until n) {
        val j = i+(n-k)-1
        if(j == n) {
            break
        }

        ans = min(ans, a[j] - a[i])
    }

    println(ans)
}

https://atcoder.jp/contests/abc361/submissions/55335095

何個残るのかを考えて、最小値を決め打つとその場合の最大値も決まるので、決め打つ最小値としてあり得るパターンを全部調べるということですね。けっこう難しい気が…

感想

以前に比べるとモチベが落ちているのはたしかで、競プロのために投下する時間が大きく減っていることがモロに結果に出ていますね。

できるだけ精進してレートを上げていくというのが王道の楽しみ方かと思いますが、それが唯一の楽しみ方ってわけではなく、あまり精進せずにのんびりとやってコンテストだけは参加するというのもアリかなと直近は思っていました。しかし、精進を止めるとここまで劣化するのですね…

この場合、それなら精進しようと考えるか、いっそやめてしまうか、開き直ってこういう結果が出ることを許容するか、のいずれかが考えられます。ちょっと悩んでいるのですが、少なくともやめたくはないのですよねぇ。とりあえずは現状維持程度はできるように多少は精進するみたいな中途半端な感じになりそう。
(執筆時間: 16分38秒)

Discussion