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
回答 (upsolved): https://atcoder.jp/contests/abc333/submissions/48594676
十進法ですべての桁の数字が 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)
全体を振り返って
今週アドカレやらなんやらで忙しかったのですが、今日も頑張って参加します!
この記事が気に入ったらサポートをしてみませんか?