Давши список кіл, виведіть площу найменшого, що містить прямокутник


28

Вам буде наданий список радіусів, ви повинні вивести площу найменшого прямокутника, до якого вони всі вмістяться.

Наприклад, з урахуванням списку, який [5,3,1.5]ви виведете 157.460.

Це зображення:

Ширина - 15,7460, а висота - 10, тому площа 157,460

Правила:

  • Ви отримуєте список через stdin або аргумент функції, виводите відповідь через stdout або return return.

  • Радіуси матимуть не більше 2 знаків після коми.

  • Список матиме довжину від 2 до 6.

  • Вихід повинен бути точним до 3 знаків після коми.

  • Якщо вам потрібно, π = 3,1416.

Тестові приклади:

Найкоротший код у байтах виграє.



1
я не бачу об'єктивного критерію виграшу
Малтісен

це одне з наших найголовніших правил
Малтісен

2
@Tim Most - це кодовий гольф, метою якого є його кодування в найменшій кількості байтів. Я думаю, що це призведе до гарного завдання для гольфу з кодом, оскільки він має точну специфікацію.
xnor

Я рекомендую позбутися умови "округлого, не врізаного", оскільки це периферійне завдання, а деякі мови можуть просто виконувати це, тоді як для інших потрібне додаткове кодування, щоб це відбулося. Я не впевнений, якщо ви маєте намір це нормально виводити більше 3-х знаків після коми, але я б радив дозволити і це.
xnor

Відповіді:


16

Python 2 + PySCIPOpt , 267 байт

from pyscipopt import*
R=input()
m=Model()
V,C=m.addVar,m.addCons
a,b,c=V(),V(),V()
m.setObjective(c)
C(a*b<=c)
P=[]
for r in R:
 x,y=V(),V();C(r<=x);C(x<=a-r);C(r<=y);C(y<=b-r)
 for u,v,s in P:C((x-u)**2+(y-v)**2>=(r+s)**2)
 P+=(x,y,r),
m.optimize()
m.printBestSol()

Як це працює

Запишемо задачу так: мінімізуємо c над змінними a , b , c , x 1 , y 1 ,…, x n , y n , де

  • abc ;
  • r ix ia - r i і r iy ib - y i , для 1 ≤ in ;
  • ( x i - x j ) 2 + ( y i - y j ) 2 ≥ ( r i + r j ) 2 , для 1 ≤ j < in .

Очевидно, що ми використовуємо бібліотеку зовнішньої оптимізації для цих обмежень, але ви не можете просто подати їх будь-якому старому оптимізатору - навіть Mathematica NMinimizeзациклюється на локальних мінімумах для цих крихітних тестових випадків. Якщо уважно придивитись до обмежень, ви побачите, що вони являють собою квадратично обмежену квадратичну програму , і знайти глобальний оптимум для невипуклої QCQP складно NP. Тому нам потрібна неймовірно потужна магія. Я вибрав промислово-міцний вирішувач SCIP , який є єдиним глобальним вирішувачем QCQP, з яким я міг знайти стільки, скільки безкоштовна ліцензія на академічне використання. На щастя, він має дуже приємні зв'язки Python.

Вхід і вихід

Передайте список радіусів на stdin, як [5,3,1.5]. Висновок показує objective value:прямокутник область, x1, x2прямокутник, розміри x3прямокутника область знову x4, x5перші координати центру кола, x6, x7другі координати центру кола і т.д.

Тестові справи

[5,3,1.5]157.459666673757

5,3,1.5

SCIP Status        : problem is solved [optimal solution found]
Solving Time (sec) : 0.04
Solving Nodes      : 187
Primal Bound       : +1.57459666673757e+02 (9 solutions)
Dual Bound         : +1.57459666673757e+02
Gap                : 0.00 %
objective value:                     157.459666673757
x1                                                 10   (obj:0)
x2                                   15.7459666673757   (obj:0)
x3                                   157.459666673757   (obj:1)
x4                                                  5   (obj:0)
x5                                                  5   (obj:0)
x6                                                  7   (obj:0)
x7                                   12.7459666673757   (obj:0)
x8                                                1.5   (obj:0)
x9                                   10.4972522849871   (obj:0)

[9,4,8,2]709.061485909243

Це краще, ніж рішення ОП. Точні розміри - 18 на 29 + 6√3.

9,4,8,2

SCIP Status        : problem is solved [optimal solution found]
Solving Time (sec) : 1.07
Solving Nodes      : 4650
Primal Bound       : +7.09061485909243e+02 (6 solutions)
Dual Bound         : +7.09061485909243e+02
Gap                : 0.00 %
objective value:                     709.061485909243
x1                                                 18   (obj:0)
x2                                   39.3923047727357   (obj:0)
x3                                   709.061485909243   (obj:1)
x4                                                  9   (obj:0)
x5                                   30.3923047727357   (obj:0)
x6                                                 14   (obj:0)
x7                                   18.3923048064677   (obj:0)
x8                                                  8   (obj:0)
x9                                                  8   (obj:0)
x10                                                 2   (obj:0)
x11                                  19.6154311552252   (obj:0)

[18,3,1]1295.999999999

18,3,1

SCIP Status        : problem is solved [optimal solution found]
Solving Time (sec) : 0.00
Solving Nodes      : 13
Primal Bound       : +1.29599999999900e+03 (4 solutions)
Dual Bound         : +1.29599999999900e+03
Gap                : 0.00 %
objective value:                       1295.999999999
x1                                   35.9999999999722   (obj:0)
x2                                                 36   (obj:0)
x3                                     1295.999999999   (obj:1)
x4                                   17.9999999999722   (obj:0)
x5                                                 18   (obj:0)
x6                                   32.8552571627738   (obj:0)
x7                                                  3   (obj:0)
x8                                                  1   (obj:0)
x9                                                  1   (obj:0)

Бонусні випадки

[1,2,3,4,5]230.244214912998

1,2,3,4,5

SCIP Status        : problem is solved [optimal solution found]
Solving Time (sec) : 401.31
Solving Nodes      : 1400341
Primal Bound       : +2.30244214912998e+02 (16 solutions)
Dual Bound         : +2.30244214912998e+02
Gap                : 0.00 %
objective value:                     230.244214912998
x1                                   13.9282031800476   (obj:0)
x2                                    16.530790960676   (obj:0)
x3                                   230.244214912998   (obj:1)
x4                                                  1   (obj:0)
x5                                   9.60188492354373   (obj:0)
x6                                    11.757778088743   (obj:0)
x7                                   3.17450418828415   (obj:0)
x8                                                  3   (obj:0)
x9                                    13.530790960676   (obj:0)
x10                                  9.92820318004764   (obj:0)
x11                                   12.530790960676   (obj:0)
x12                                                 5   (obj:0)
x13                                                 5   (obj:0)

[3,4,5,6,7]553.918025310597

3,4,5,6,7

SCIP Status        : problem is solved [optimal solution found]
Solving Time (sec) : 90.28
Solving Nodes      : 248281
Primal Bound       : +5.53918025310597e+02 (18 solutions)
Dual Bound         : +5.53918025310597e+02
Gap                : 0.00 %
objective value:                     553.918025310597
x1                                   21.9544511351279   (obj:0)
x2                                   25.2303290086403   (obj:0)
x3                                   553.918025310597   (obj:1)
x4                                                  3   (obj:0)
x5                                   14.4852813557912   (obj:0)
x6                                   4.87198593295855   (obj:0)
x7                                   21.2303290086403   (obj:0)
x8                                   16.9544511351279   (obj:0)
x9                                                  5   (obj:0)
x10                                                 6   (obj:0)
x11                                                 6   (obj:0)
x12                                  14.9544511351279   (obj:0)
x13                                  16.8321595389753   (obj:0)

[3,4,5,6,7,8]777.87455544487

3,4,5,6,7,8

SCIP Status        : problem is solved [optimal solution found]
Solving Time (sec) : 218.29
Solving Nodes      : 551316
Primal Bound       : +7.77874555444870e+02 (29 solutions)
Dual Bound         : +7.77874555444870e+02
Gap                : 0.00 %
objective value:                      777.87455544487
x1                                   29.9626413867546   (obj:0)
x2                                   25.9614813640722   (obj:0)
x3                                    777.87455544487   (obj:1)
x4                                   13.7325948669477   (obj:0)
x5                                   15.3563780595534   (obj:0)
x6                                   16.0504838821134   (obj:0)
x7                                   21.9614813640722   (obj:0)
x8                                   24.9626413867546   (obj:0)
x9                                   20.7071098175984   (obj:0)
x10                                                 6   (obj:0)
x11                                  19.9614813640722   (obj:0)
x12                                                 7   (obj:0)
x13                                                 7   (obj:0)
x14                                  21.9626413867546   (obj:0)
x15                                  8.05799919177801   (obj:0)

Сором останній дає незначну помилку округлення, але приємна робота!
Тім

Мені здається, що [1,2,3,4,5] можна було б покращити, якщо доторкнутися також радіус 3 та радіус 5 кіл, а потім трохи повернути радіус 4 / радіус 5 по діагоналі за годинниковою стрілкою (радіус 1 кола повинен був би Не можна переносити з дороги, але для цього є багато місця для мертвих. І мій інстинкт, і мої розрахунки вказують на те, що довгий тонкий прямокутник може містити радіус 4 / радіус 5 кіл ефективніше, ніж квадратний.
Рівень річки Св.

@LevelRiverSt Я не згоден. Переміщення 3 вгору, щоб торкнутися 5, відсунуло б 4 праворуч (проти годинникової стрілки від 5), не давши йому рухатися вліво (за годинниковою стрілкою від 5). Конфігурація моєї програми: (7 + 4√3) × (9 + √ (29 + 16√3)) ≈ 13.9282 × 16.5308 ≈ 230.244, тоді як запропонована вами конфігурація (30 + 15√3) / 4 × (36 + 3 √5 + 6√15) / 4 ≈ 13,9952 × 16,4865 ≈ 230,732.
Anders Kaseorg
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.