Спасибо! На руби получилось
Теперь пойду переписывать на Хашкель.
И ещё, вопрос по второй задачке.
Суть её такова:
Я хочу построить дом. Но у меня есть только 4 стены с длинами сторон a, b, c, d. Я хочу сделать из них четырёхугольный дом с наибольшой площадью.
На вход подаются кол-во тестовых случаев и сами случаи в виде значений четырёх сторон.
На выходе- максимальная площадь из площадей всех четырёхугольников, которые можно из этих сторон составить.
Здесь я воспользовался формулой вычисления площади произвольного четырёхугольника по его сторонам.
На руби выглядит так:
Код:
include Math
def area()
str = readline.chop
str1 = str.split(' ')
a = str1[0].to_f
b = str1[1].to_f
c = str1[2].to_f
d = str1[3].to_f
s = ( a + b + c + d ) / 2.0
ar = sqrt((s-a)*(s-b)*(s-c)*(s-d))
p ar
end
n = gets.to_i
for i in 1..n
area()
end
И это работает, на spoj.pl задачу зачли.
Теперь, переписываю на Haskell:
Код:
import System.Exit
main :: IO ExitCode
main = do str <- getLine
run (read str)
g str = [x, y, z, a]
where [x,y,z,a] = (map read . words) str
run :: Integer-> IO ExitCode
run 0 = return ExitSuccess
run x = do
str <- getLine
let [b, c, d, e] = g str
print (geoprob b c d e)
run (x-1)
geoprob:: Double->Double->Double->Double->Double
geoprob b c d e = sqrt( ( p - b ) * (p - c ) * ( p - d ) * ( p - e ) )
where p = (b + c + d + e)/2
Но тут уже вылазит TLE. Чесс говоря, не очень понимаю, как тут можно сократить время работы. Если использовать формулу площади четырехугольника как полупроизведение диагоналей на синус угла между ними, то ведь тоже вылезут квадратные корни, умножения...
Можно ли как-то иначе?