AtCoder Beginner Contest 333 振り返り

忙しくて1週間経っちゃいましたが振り返りです!

結果

CがTLEになって今回も2完でした。なかなか進まない。


各問題の振り返り

A - Three Threes

nをn回繰り返しで表示する問題。
show n して replicate nしたものをconcatします。

main :: IO ()
main = do
  n <- readLn @Int

  putStrLn $ concat $ replicate n $ show n

B - Pentagon

五角形の各点の距離を比較する問題です。各点に数字を割り当てて距離を求める方法もあったのですが、愚直にパターンマッチで解きました。

main :: IO ()
main = do
  [s1, s2] <- getLine
  [t1, t2] <- getLine

  putStrLn $ solve (s1, s2) (t1, t2)

solve :: (Char, Char) -> (Char, Char) -> String
solve ss tt = isEqLen
  where
    go ('A', 'B') = 1
    go ('A', 'E') = 1
    go ('B', 'C') = 1
    go ('B', 'A') = 1
    go ('C', 'D') = 1
    go ('C', 'B') = 1
    go ('D', 'C') = 1
    go ('D', 'E') = 1
    go ('E', 'D') = 1
    go ('E', 'A') = 1
    go (_, _) = 2

    isEqLen = if go ss == go tt then "Yes" else "No"

C - Repunit Trio

十進法ですべての桁の数字が 11 である整数(レピュニット)の和のうち、小さい方からN番目を求める問題です。
手元で書いたコードが遅すぎて頑張って高速化しようとしたのですがタイムオーバーになってしまいました。

実は制約と解答例をよくみると

制約

  • N は 11 以上 333333 以下の整数

  • 入力例: 333

  • 出力例: 112222222233

となっていて、出力例の最大値は12桁となっていることがわかります。
これから、どんなに大きくてもレピュニットは12桁以下ということがわかるので、以下の様に解くことができます。

main :: IO ()
main = do
  n <- readInt

  let repunits = map (\n -> read @Int (replicate n '1')) [1 ..]
  print $ (map head . L.group . L.sort $ [x + y + z | x <- take 12 repunits, y <- take 12 repunits, z <- take 12 repunits]) !! (n - 1)

全体を振り返って

今週アドカレやらなんやらで忙しかったのですが、今日も頑張って参加します!

この記事が気に入ったらサポートをしてみませんか?