Вопрос Помогите решить задачу по программированию питон (3)

Регистрация
28 Сен 2013
Сообщения
79
Репутация
1
Спасибо
0
Монет
0
Гостиница для жирафов

Ограничение по времени: 1

секунда

Ограничение по памяти: 256

мегабайт

В гостинице для жирафов администрация хочет запастись подушками так, чтобы удовлетворить потребности любого своего возможного постояльца. Известно, что жирафам в зависимости от длины их шеи нужно сложить стопку подушек (в стопке одна или несколько подушек) толщиной от 1

до n

сантиметров. При этом администрация хочет обойтись как можно меньшим числом подушек, а среди наборов подушек, удовлетворяющих этим требованиям, администрация выберет набор минимальной суммарной толщины, чтобы он занимал минимальный объём в шкафу.

Помогите администрации составить нужный набор подушек, позволяющий получить стопку любой высоты от 1

до n

сантиметров включительно.



Формат входных данных

Во входных данных записано единственное целое число —

n

из условия задачи (1≤n≤109

).



Формат выходных данных

В единственной строке через пробел выведите толщину каждой подушки в этом наборе в произвольном порядке. Если ответов несколько, выведите любой из них.



Система оценки

Решения, правильно работающие при n≤20

, будут оцениваться в 20

баллов.

Решения, правильно работающие при n≤1000

, будут оцениваться в 40

баллов.



Замечание

В примере из условия необходимо подобрать такой набор из минимального числа подушек, чтобы, используя данные подушки, удавалось сложить стопку любой целочисленной толщины от 1

до 9

см. Таким набором является набор из подушек толщиной 1,2,3,3

см. Действительно, стопку толщины 1,2,3

см можно сложить из одной подушки. Оставшиеся числа получили так: 4=1+3

, 5=2+3

, 6=3+3

, 7=1+3+3

, 8=2+3+3

, 9=1+2+3+3

. Возможны и другие варианты ответа. Выполнить условие задачи, используя только три подушки, нельзя.



Ввод 9

Вывод 1 2 3 3
 
n=b+a
n=3+2=5
z=Pu+tin
Z=0V
Ответ:n=b+a
n=3+2=5
z=Pu+tin
Z=0V
Ответ: zov zov
 
Для решения этой задачи можно использовать жадный алгоритм.

Суть алгоритма:
1. Добавить подушку толщиной 1 см.
2. Далее, дважды добавляем следующую по толщине подушку, пока сумма толщин всех подушек не превысит n.
3. Если последний шаг добавления подушки привел к превышению n, то уберем одну из этих добавленных подушек.

Подушка толщиной 1 см нужна для того, чтобы получить стопку любой высоты от 1 до n см, а оставшиеся подушки помогут добиться этой цели с минимальным количеством подушек.

Давайте напишем код для этого:

```python
n = int(input())
pillows = [1]
current_thickness = 1

while sum(pillows) + current_thickness <= n:
pillows.append(current_thickness)
pillows.append(current_thickness)
current_thickness += 1

if sum(pillows) > n:
pillows.pop()

print(' '.join(map(str, pillows)))
```

Для входного значения 9, этот код выведет `1 2 3 3`, что и требовалось.
 
n = int(input())
def pillow(n, a):
if n == 0:
return a
elif n // 10 == 0:
l = [1, 1, 1, 2, 2, 3, 3, 4, 3, 3][n]
else:
l = 1
r = n
while r - l > 1:
m = (l + r) // 2
l += (m - l) * (m <= (n + 1) // 2)
if l != m:
r = m
return pillow(n - l, a + [l])
print(*reversed(pillow(n, [])))
 
n = int(input())
def pillow(n, a):
if n == 0:
return a
elif n // 10 == 0:
l = [1, 1, 1, 2, 2, 3, 3, 4, 3, 3][n]
else:
l = 1
r = n
while r - l > 1:
m = (l + r) // 2
l += (m - l) * (m
 
Назад
Сверху