Otrzymasz listę promieni, musisz wyprowadzić obszar najmniejszego prostokąta, w którym się zmieszczą.
Na przykład, biorąc pod uwagę listę, [5,3,1.5]
którą wypiszesz 157.460
.
To jest obrazek:
Szerokość wynosi 15.7460, a wysokość to 10, więc obszar wynosi 157.460
Zasady:
Otrzymujesz listę za pomocą argumentu stdin lub funkcji, a odpowiedź podajesz przez stdout lub return funkcji.
Promienie będą miały najwyżej 2 miejsca po przecinku.
Lista będzie miała długość od 2 do 6.
Dane wyjściowe powinny być dokładne z dokładnością do 3 miejsc po przecinku lub więcej.
Jeśli potrzebujesz, π = 3,1416.
Przypadki testowe:
[5,3,1.5] = 157.460
[9,4,8,2] = 733.431
- pracuję tutaj .[18,3,1] = 1296.000
Najkrótszy kod w bajtach wygrywa.
Odpowiedzi:
Python 2 + PySCIPOpt , 267 bajtów
Jak to działa
Piszemy problem w następujący sposób: zminimalizuj c ponad zmiennymi a , b , c , x 1 , y 1 ,…, x n , y n , gdzie
Oczywiście używamy zewnętrznej biblioteki optymalizującej te ograniczenia, ale nie możesz po prostu podać ich do żadnego starego optymalizatora - nawet Mathematica
NMinimize
utknęła na lokalnych minimach dla tych małych przypadków testowych. Jeśli przyjrzysz się uważnie ograniczeniom, zobaczysz, że stanowią one kwadratowy program kwadratowy , a znalezienie globalnego optimum dla niewypukłego QCQP jest trudne. Potrzebujemy więc niesamowicie potężnej magii. Wybrałem przemysłowy program do rozwiązywania problemów SCIP , który jest jedynym globalnym programem do rozwiązywania problemów QCQP, jaki udało mi się znaleźć, oferując darmową licencję do użytku akademickiego. Na szczęście ma kilka bardzo fajnych powiązań w języku Python.Wejście i wyjście
Przekaż listę promieni na stdin, jak
[5,3,1.5]
. Na wyświetlaczu wyjścioweobjective value:
obszar prostokątx1
,x2
prostokąt wymiary,x3
prostokątny obszar ponowniex4
,x5
najpierw współrzędne środka okręgu,x6
,x7
drugie koło współrzędne środka itpPrzypadki testowe
[5,3,1.5]
↦157.459666673757
[9,4,8,2]
↦709.061485909243
To lepsze niż rozwiązanie PO. Dokładne wymiary to 18 na 29 + 6√3.
[18,3,1]
↦1295.999999999
Przypadki bonusowe
[1,2,3,4,5]
↦230.244214912998
[3,4,5,6,7]
↦553.918025310597
[3,4,5,6,7,8]
↦777.87455544487
źródło