Life Goes On

まあまあだけど楽しんでる方です

85問目

http://projecteuler.net/index.php?section=problems&id=85
3 × 2 の長方形は 18 個の長方形を含んでいる。二百万に最も近い数の長方形を含む長方形の面積を求める。
a × b の長方形が含む長方形の個数は ab(a+1)(b+1)/4 となるので、(a, b) = (1, 2000) から始めて、面積が二百万より大きかったら b を減らし、小さかったら a を増やして調べていきます。
a b
1 2000 (大)
1 1999 (小)
2 1999 (大)
:
2 1154 (小)
3 1154 (大)
:

import Data.List
import Data.Ord

main = print $ euler085 2000000 

euler085 :: Int -> Int
euler085 n = getMin n (0, 0) $ takeWhile ((< n) . (f 1)) [1..]

getMin :: Int -> (Int, Int) -> [Int] -> Int
getMin n (a, b) [] = a * b
getMin n (a, b) xs = if n < f (head xs) (last xs)
    then getMin n m $ init xs
    else getMin n m $ tail xs
    where
    m = minimumBy (comparing abs') [(a, b), (head xs, last xs)]
    abs' (x, y) = abs (f x y - n)

f :: Int -> Int -> Int
f a b = div (a * (a + 1) * b * (b + 1)) 4