ABC407 を Haskell で
結果
2 完でした。
C は Word8
を使って実装したせいでアンダーフローに気づけませんでした。
コンテスト中に慣れない実装をするものではないですね。
A
問題文
正整数
実数
ただし、制約のもとでそのような整数がただ一つ存在することが証明できます。
制約
1 \leq A \leq 407 1 \leq B \leq 407 -
は奇数B - 入力はすべて整数
方針
実装
solve :: Int -> Int -> Int
solve a b = if a `mod` b <= b `div` 2 then a `div` b else a `div` b + 1
main :: IO ()
main = do
[a, b] <- ints
print $ solve a b
B
問題文
1,2,3,4,5,6の6種類の目が出るサイコロを2つ振ったときに、次の2つの条件の少なくとも一方を満たす確率を求めてください。
- 2つの出目の合計が
以上である。X - 2つの出目の差の絶対値が
以上である。Y
ここで、どちらのサイコロについても6種類のどの目が出るかは同様に確からしく、それぞれのサイコロの出目は独立であるとします。
制約
2 \leq X \leq 13 0 \leq Y \leq 6 - 入力はすべて整数
方針
リストモナドで全探索
実装
solve :: Int -> Int -> Double
solve x y = ((/ (36 :: Double)) . int2Double . length) $ do
a <- [1 .. 6]
b <- [1 .. 6]
guard $ a + b >= x || abs (a - b) >= y
pure True
main :: IO ()
main = do
[x, y] <- ints
print $ solve x y
C
問題文
AtCoder社の入口には特殊なパスコード入力装置があり、この装置は文字列を1つ表示する画面と2つのボタンからなります。
画面に表示される文字列を
-
ボタンAを押すと、
の末尾にt が追加される。0 -
ボタンBを押すと、
に含まれるすべての数字が、それぞれ次の数字に置き換わる。ここで、t から0 までの数字については次の数字は1大きな数を表す数字とし、8 の次の数字は9 とする。0
たとえば、
文字列
制約
-
はS からなる文字列0,1,2,3,4,5,6,7,8,9 -
(1 \leq |S| \leq 5 \times 10^5 は|S| の長さを表す)S
方針
ゴールである
実装
solve :: BS.ByteString -> Int
solve s = buttonAClickCount + buttonBClickCount
where
buttonAClickCount :: Int
buttonAClickCount = BS.length s
buttonBClickCount :: Int
buttonBClickCount =
sum $
fromIntegral
<$> BS.zipWith (\c c' -> (10 + c - c') `mod` 10) s (BS.snoc (BS.tail s) zero)
zero :: Word8
zero = c2w '0'
main :: IO ()
main = do
s <- BSC.getLine
print $ solve s
Discussion