В Канаде копейки больше не распространяются. Наличные платежи округляются до ближайших 5 центов.
Деньги можно сэкономить, разделив покупки. Например, два предмета по 1,02 долл. США стоят 2,04 долл., Что округляет до 2,05 долл., Но при покупке предметов по отдельности каждая цена округляется до 1,00 долл., Что в сумме составляет 2,00 долл. США. Однако при покупке двух предметов по 1,03 долл. Каждый лучше покупать их за одну покупку.
Еще один способ сэкономить деньги - использовать кредитную карту, когда округление является неблагоприятным, поскольку платежи по кредитам не округляются. Если мы хотим получить два товара по 1,04 доллара, общая цена будет округлена до 2,10 доллара независимо от того, как мы разделили покупки. Поэтому мы должны оплатить эти товары с помощью кредитной карты.
Напишите функцию или программу, которая принимает список цен товаров в виде целых чисел в центах и выводит наименьшую возможную общую цену (в центах) для тех товаров, которая может быть достигнута с помощью последовательности покупок, каждая из которых является либо наличными, либо кредитом.
Самый короткий код выигрывает.
Контрольные примеры
[] : 0
[48] : 48
[92, 20] : 110
[47, 56, 45] : 145
[55, 6, 98, 69] : 225
[6, 39, 85, 84, 7] : 218
[95, 14, 28, 49, 41, 39] : 263
[92, 6, 28, 30, 39, 93, 53] : 335
[83, 33, 62, 12, 34, 29, 18, 12] : 273
[23, 46, 54, 69, 64, 73, 58, 92, 26] : 495
[19, 56, 84, 23, 20, 53, 96, 92, 91, 58] : 583
[3, 3, 19, 56, 3, 84, 3, 23, 20, 53, 96, 92, 91, 58, 3, 3] : 598
[2, 3, 4, 4, 4, 4, 4] : 19
s.reduce(:+)
(обычно вам даже не нужны паратезы, но в вашем случае ...) и встроитьm
дополнительные 2 символа.a,b,c,d=(1..4).map{|i|s.count{|x|x%5==i}}
.0,
изreduce
вызова, код обрывается для пустого ввода. Я упомянул это в ответе. Встраивание m, кажется, не помогает. Спасибо за последнее предложение - это было глупо с моей стороны.(c-m=c>d ?d:c)
что дает вам два символа.-
имеет более высокий приоритет, чем=
. Это то, что присвоение имеет высокий приоритет на левой стороне (например, чтобы убедиться, что левый операнд является lvalue)?GolfScript (54 символа)
Это программа, которая принимает входные данные из stdin в качестве разделенных пробелами значений. Один символ может быть сохранен, если вместо этого ввести формат ввода в виде массивов GolfScript.
Тестовые случаи онлайн
Самый интересный трюк
.2$>$
для неразрушающегоmin
оператора.Мой анализ математики по сути такой же, как и анализ Яна и Рэя: учитывая значения мод 5, единственная экономия на транзакциях стоимостью 1 или 2. Опция кредитной карты означает, что мы никогда не сходимся. Таким образом, предмет, который стоит 5n + 2 цента, не может выиграть от связывания; и при этом предмет не может стоить 5n + 1 центов (потому что объединение двух 1-центовых сбережений в 2-центовые сбережения не дает никакой выгоды). 0 - аддитивная тождественность, поэтому единственные интересные случаи включают значения 3 и 4.
3+3 = 1
и3+4 = 4+4+4 = 2
; если у нас есть смешанные 3s и 4s , то мы оптимизируем предпочитая3+4
более3+3
(строго лучше) или4+4+4
(эквивалент).источник
~):m
), к сожалению, без уменьшения количества символов.C ++: 126 символов
Добро пожаловать, чтобы дать руководство, чтобы эта программа стала короче. Вот тестовая программа, скомпилируйте с помощью компилятора tdm-gcc 4.7.1 и работайте нормально.
источник
R 143
Тесты (где
P
псевдоним для кода выше)источник
Mathematica
112 126 167157Изменить : Случаи {3, 3} и {4,4,4} теперь обрабатываются благодаря Питеру Тейлору и картонному ящику.
Примечание. Номера для покупок (контрольный пример № 1) вводятся как
f[{0}]
.Как это устроено
Mod[n, 5]
затем обрабатываются: 1 и 2 становятся 0. Нули остаются неизменными.тестирование
a12
настраивается на {3,3}a13
регулируется на {4,4,4}источник
Python 3 (115 символов)
Python 2 (106 символов)
источник
[3,4,9]
должен дать14
, потому что вы можете объединить элементы 3 и 4 цента, чтобы получить 7-центовую покупку, которую вы платите наличными с 5 центами, а оставшуюся 9-центовую вещь вы заплатите в кредит, потому что в противном случае она округлилась бы в большую сторону.1, 2, 3, 4, 5, 6, 7, 8, 9, 10
, это дает0.0, 0.0, 2.5, 3.33, 5.0, 5.0, 5.0, 7.5, 8.33, 10.0
, что суммы46.66
. Тем не менее, правильный ответ таков45
, поэтому сумма чисел, которые вы печатаете, не является правильным ответом, и, следовательно, это решение неверно.APL, 58 символов
Программа по сути является прямым переводом Ruby от Jan Dvorak .
⍬
это пустой вектор.источник
Юлия 83C
Explaination:
За одну покупку вы можете сэкономить не более 2 центов.
Так что если у вас есть комбинация, которая может сэкономить вам 2 цента, просто купите ее таким образом, и она будет оптимальной. Например, если у вас естьx
предметы с ценой 3 (мод 5) иy
предметы с ценой 4 (мод 5), вы можете сделатьmin(x, y)
количество (3, 4) пар, что сэкономит ваши2 min(x, y)
центы. Затем вы используете остальные 3, если таковые имеются, чтобы сэкономить вашиmax(0, x-min(x,y)) / 2
центы. Это также может быть рассчитано по(max(x,y)-y)/2
редактировать
Это решение неверно.
источник
4 4 4 3 3
то4 4 4
есть комбинация, которая может сэкономить 2 цента, но ее покупка не является оптимальной. (На самом деле, вы, похоже, вообще не принимаете4 4 4
во внимание. Разве этот код не проходит последний тестовый случай?)