A
そのまま。
a.hs
main = do
[a,b,x] <- map read . words <$> getLine :: IO [Int]
putStrLn $ if a+b>=x && a<=x then "YES" else "NO"
B
そのまま。
b.hs
import Data.List
main = do
[n,m,x] <- map read . words <$> getLine :: IO [Int]
al <- map read . words <$> getLine :: IO [Int]
print $ solve al x
solve al x =
let (f,s) = (span (< x) al) in
minimum $ map (length) [f,s]
C
時間がなくて(!!)
を用いてしまった。
(n>1. 0<=n/2-1<n/2<=n-1)
c.hs
import Data.List
main = do
n <- read <$> getLine::IO Int
xs <- map read . words <$> getLine ::IO [Int]
let xs_ = sort xs
let (m1,m2) = (xs_!!(div n 2-1),xs_!!(div n 2))
mapM_ print $ solve m1 m2 xs
solve _ _ [] = []
solve m1 m2 (x:xs) =
(if x<=m1 then m2 else m1) : solve m1 m2 xs
D
パスカルの三角形までは思いついたが実装で時間切れになってしまった。最初は無駄にソートをしてから考えたが、minimumBy
で実装できた。
d.hs
import Data.List
import Text.Printf
main = do
_ <- getLine
as <- map read . words <$> getLine::IO[Int]
let [n, r] = solve as
printf "%d %d\n" n r
solve as =
[n, r]
where
r = minimumBy (\x y -> compare (abs $ n'-x) (abs $ n'-y)) $ delete n as
n = maximum as
n' = div n 2
printf
を使わないやり方もあった。
putStrLn $ unwords $ map show $ solve as
E
e.hs
F
f.hs