Оптимізуйте порядок крил


17

Цей твіт перераховує можливі замовлення на крила китайського ресторану 1 :

Меню крил

При замовленні піци я зазвичай підраховую, який розмір дає мені найкраще співвідношення ціни та піци, що є простим розрахунком. Однак мінімізація ціни замовлення в цьому ресторані не така проста задача, тому я хотів би бути готовим до свого наступного замовлення там.

Виклик

З огляду на ціле число більше або рівне , ваше завдання - повернути одне можливе замовлення, яке мінімізує ціну (загалом найдешевший) та кількість угод.4

Приклад

Якби я замовив Крил, виявляється, найкраща угода обійдеться в100$111.20 . Однак є кілька замовлень, які коштуватимуть цю суму, а саме:

[50,50],[25,25,50],[25,25,25,25]

Оскільки в першому замовленні буде використано найменшу кількість угод (2 ), результат буде [50,50].

Правила

  • Вхід буде деяким цілим числом n4
  • Виведенням буде список / масив / ... розмірів замовлення, які підсумовують n і мінімізують ціну замовлення
    • Ви можете повернути всі можливі замовлення

Тестові шафи

4 -> [4]  (4.55)
23 -> [23]  (26.10)
24 -> [6,18],[9,15],[12,12]  (27.20)
31 -> [6,25]  (34.60)
32 -> [4,28],[6,26],[7,25]  (35.75)
33 -> [4,29],[5,28],[6,27],[7,26],[8,25]  (36.90)
34 -> [6,28],[9,25]  (38.00)
35 -> [35]  (39.15)
125 -> [125]  (139.00)
200 -> [25,50,125]  (222.40)
201 -> [26,50,125]  (223.55)
250 -> [125,125]  (278.00)
251 -> [26,50,50,125]  (279.15)
418 -> [15,28,125,125,125],[18,25,125,125,125]  (465.20)
1001 -> [26,50,50,125,125,125,125,125,125,125]  (1113.15)
12345 -> [15,80,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125],[25,70,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125],[45,50,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125]  (13728.10)

Примітка. У цих тестових скриньках перераховані всі можливі результати, включаючи ціну, вам потрібно лише один, і вам не потрібно виводити ціну!


1: Ви можете знайти дані як CSV тут .


3
Справжнє питання - хто замовляє 200, а то й 100 крил? ...
Ерік Аутгольфер

2
@Quintec: Чому вам потрібно більше тестів?
ბიმო

1
Два відповіді неправильно трактували вимоги, як лише потребують мінімізації ціни. Оскільки мінімізація ціни та кількості угод неоднозначна (найнижча ціна, доступна у способах з найменшою кількістю угод, або найменша кількість доступних угод із способів із найнижчою ціною), варто було б редагувати вимогу, щоб бути більш чітким
trichoplax


1
Зауважую, що при ціна задана 1n23, тоді як ціни на25<n<=50можна розділити на25іn-25(дляn<29їх не можна придбати окремо, але формула все-таки дає відповідне значення). 70,80і125можна також отримати за попередніми значеннями, тому, якщо ви можете використовувати їх, вони зменшать кількість угод. Інші цінності неекономічні. 120(68n3)25<n<=5025n25n<297080125
Ніл

Відповіді:


7

JavaScript (ES6), 123 байти

Повертає порядок у вигляді розділеного пробілом рядка.

f=n=>n?(x=n>128|n==125?125:n>50?n<54?25:n-70?302256705>>n-80&n>79&n<109?80:50:n:n-24&&n-49?n<31|n%5<1?n:25:9)+' '+f(n-x):''

Спробуйте в Інтернеті!

Як?

Дано число n крил, ми рекурсивно застосовуємо наступну стратегію.

Високі значення: n>128 або n=125

Для високих значень найкращий наш варіант - купити 125 крил. Отже, це ми робимо до тих пір, поки n більше або дорівнює 129 або коли n точно дорівнює 125 .

Ми не можемо цього зробити для 125<n<129 оскільки нам залишилося менше 4 крил, щоб придбати, що неможливо.

Низькі значення: n<31

n<31n=242×1218+615+99

31n50

25

  • n5
  • n=4940+928+219

51n53

504252×26n=5225+27

54n128n125

50

  • n=70
  • n{80,86,89,92,98,105,108}8080108

    10010000001000001001001000001(2)=302256705(10)


4

JavaScript (Node.js) , 112 108 106 105 байт

f=n=>n?(x=n>128|n==125?125:n>53&n!=70?1629>>n/3+6&n<99==n%3/2?80:50:~n%25?n>30&&n%5?25:n:9)+' '+f(n-x):''

Спробуйте в Інтернеті!

Оптимізовано з відповіді Арнальда

Відмінності

  • 51≤n≤53 об'єднується в 31≤n≤50 (збереження 8 байтів)
  • Перезапис растрової карти (збереження 3 байтів)
  • Переставити деяку логіку ( 4 6 7 байтів збережено)

2

Сітківка 0,8.2 , 160 155 байт

.+
$*
{`\b(1{80}(?=((111){2,6}|1{25}|1{28})?$)|1{70}$|1{9}(?=.{15}$|.{40}$)|(1{5}){6,9}$|1{26,29}$|1{4,23}$|1{125}|1{50}|1{25})+$
$1,$&
(1+),\1(1*)$
$.1,$2

nn

.+
$*

Перетворити в одинарне.

{`

Повторюйте, поки більше жодних угод не можна буде придбати.

{`\b(1{80}(?=((111){2,6}|1{25}|1{28})?$)|1{70}$|1{9}(?=.{15}$|.{40}$)|(1{5}){6,9}$|1{26,29}$|1{4,23}$|1{125}|1{50}|1{25})+$
$1,$&

Знайдіть спосіб купівлі угод та захопіть та копіюйте одну з угод.

(1+),\1(1*)$
$.1,$2

н

Пропозиції купуються за таких умов:

1{80}(?=((111){2,6}|1{25}|1{28})?$)

Придбайте 80 крил, якщо у них залишиться 0, 6, 9, 12, 15, 18, 25 або 28 крил.

1{70}$

Придбайте 70 крил, якщо це все, що нам потрібно.

1{9}(?=.{15}$|.{40}$)

Придбайте 9 крил, якщо у них залишиться 15 або 40 крил.

(1{5}){6,9}$

Придбайте 30, 35, 40 або 45 крил, якщо це все, що нам потрібно.

1{26,29}$

Придбайте крила 26, 27, 28 або 29, якщо це все, що нам потрібно.

1{4,23}$

Придбайте 4 - 23 крила, якщо це все, що нам потрібно.

1{125}|1{50}|1{25}

Придбайте 125, 50 або 25 крил, якщо ми можемо, і якщо ми все-таки зможемо придбати більше крил. Зауважте, що у нас є ці варіанти в кінці чергування, щоб спочатку перевірити точні покупки.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.