Форум программистов, компьютерный форум, киберфорум
Python для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.69/26: Рейтинг темы: голосов - 26, средняя оценка - 4.69
38 / 39 / 7
Регистрация: 13.11.2020
Сообщений: 678

Найдите, какое минимальное число фигурок ей понадобится, чтобы Мила смогла заполнить нижние ряды поля, образовав прямоуг

22.11.2020, 10:42. Показов 5105. Ответов 19

Студворк — интернет-сервис помощи студентам
В этой игре есть поле в форме стакана ширины n, разделенное на клетки размером 1×1. В отличие
от обычного Тетриса, в этой игре используются горизонтальные фигурки 1 × x, состоящие из x
клеток: высоты 1 и ширины x. Перед падением очередной фигурки, игрок может выбрать ее размер
x любым целым числом от 1 до n, включительно. Фигурки нельзя поворачивать, но можно двигать
влево и вправо. Фигурка падает до тех пор, пока не наткнётся на другую фигурку, либо на дно
стакана.
Мила не любит оставлять пустые клетки под фигурами. Ее цель — заполнить нижние ряды поля,
чтобы занятая фигурками часть образовала прямоугольник ширины n.
Вам задано состояние поля в формате: a1, a2, . . . , an, где ai — число клеток, занятых в i-м столбце
стакана. В заданном поле никакая пустая клетка не находится под занятой. Например, для последовательности a, равной 3, 2, 4, 2, 2, 4, поле будет выглядеть так:


Найдите, какое минимальное число фигурок ей понадобится, чтобы Мила смогла заполнить
нижние ряды поля, образовав прямоугольник ширины n.

Входные данные:
В первой строке задано целое число n — ширина игрового поля (1 <= n <= 2 · 105
).
Во второй строке заданы n целых чисел a1, a2, . . . , an — число занятых клеток в каждом из столбцов поля (0<=ai <=109
).
Хотя бы одно из ai больше 0

Выходные данные:
Выведите единственное целое число: минимальное число фигурок, необходимое Миле для составления прямоугольника ширины n.
Миниатюры
Найдите, какое минимальное число фигурок ей понадобится, чтобы Мила смогла заполнить нижние ряды поля, образовав прямоуг  
Изображения
 
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
22.11.2020, 10:42
Ответы с готовыми решениями:

Какое минимальное количество итераций понадобится чтобы определить случайное число от 0 - до 256?
задание такое: какое минимальное количество итераций понадобится чтобы определить случайное число от 0 - до 256?

Какое минимальное время понадобится кораблю для того, чтобы достичь точки?
Заранее спасибо!

Рассчитать, какое время понадобится, чтобы заполнить бассейн размерами a x b x h
Расчитать какое время понадобится, чтобы заполнить бассейн размерами a x b x h, если он заполняется через выбранное количество труб, а по...

19
710 / 356 / 104
Регистрация: 09.02.2018
Сообщений: 805
22.11.2020, 12:16
Как вариант:

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#import sys
 
#sys.stdin = open('input.txt', 'r')
n = int(input())
a = list(map(int, input().split()))
#sys.stdin.close()
 
ans = 0
heights_stack = [0]
height_max = max(a)
a.append(height_max)
 
for i in range(n + 1):
    hole_height = height_max - a[i]
    while hole_height < heights_stack[-1]:
        ans += heights_stack.pop() - heights_stack[-1]
    if hole_height > heights_stack[-1]:
        heights_stack.append(hole_height)
 
#sys.stdout = open('output.txt', 'w')
print(ans)
#sys.stdout.close()
2
38 / 39 / 7
Регистрация: 13.11.2020
Сообщений: 678
22.11.2020, 12:20  [ТС]
КулХацкеръ, спасибо но проходит только для одного теста для других не проходит
0
710 / 356 / 104
Регистрация: 09.02.2018
Сообщений: 805
22.11.2020, 12:21
Понятно, подумаю.
0
1 / 1 / 0
Регистрация: 24.09.2020
Сообщений: 5
22.11.2020, 12:27
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
n = int(input())
ll = list(map(int, input().split()))
prover=False
k=0
if max(ll)!=min(ll):
    while min(ll)>0:
        for i in range(0, n):
            ll[i]-=1
    for el in ll:
        if el==0 and not prover:
            prover=True
            k+=1
        elif el!=0 and prover:
            prover=False
    while max(ll)!=0:
        for i in range(0, n):
            if ll[i] == 0:
                ll[i] += 1
        for i in range(0, n):
            ll[i] -= 1
        if max(ll)!=0:
            for el in ll:
                if el == 0 and not prover:
                    prover = True
                    k += 1
                elif el != 0 and prover:
                    prover = False
print(k)
1
0 / 0 / 0
Регистрация: 09.11.2020
Сообщений: 22
22.11.2020, 12:28
ответ на первый пример
Изображения
 
0
Эксперт Python
8851 / 4502 / 1864
Регистрация: 27.03.2020
Сообщений: 7,317
22.11.2020, 12:33
Лучший ответ Сообщение было отмечено Ychenyi как решение

Решение

Ychenyi,
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
num = [1,3,4,4,5,6,1,6,1,1]
num = [9,8,7,6,5,4,3,2,1,1,2,3,4,5,6,7,8,9,1]
k = 0
mnum = max(num)
while len(num) > 1 :
    tmp = [num[0]]
    for i in range(1, len(num)) :
        if num[i] != num [i - 1] :
            tmp.append(num[i])
    num = tmp.copy()
    ind = num.index(min(num))
    a = num[ind - 1] if ind else mnum
    b = num[ind + 1] if ind < len(num) - 1 else mnum
    k += min(a,b) - num[ind]
    del num[ind]
print(k)
2
38 / 39 / 7
Регистрация: 13.11.2020
Сообщений: 678
22.11.2020, 12:37  [ТС]
Gdez, так пользователь должен сам вводить а у вас уже готовые списки
0
Эксперт Python
8851 / 4502 / 1864
Регистрация: 27.03.2020
Сообщений: 7,317
22.11.2020, 12:38
Ychenyi,
Вместо первых двух строчек
Python
1
2
n = int(input())
num = list(map(int,input().split()))
1
1 / 1 / 0
Регистрация: 24.09.2020
Сообщений: 5
22.11.2020, 12:40
21 балл. Ограничение по времени
0
0 / 0 / 0
Регистрация: 09.11.2020
Сообщений: 22
22.11.2020, 12:42
SokoMix, извини, но не особо понятно. какая табуляция в твоем коде. теги кода над рамкой ввода ответа выбираешь питон и между ними вставляешь код, заранее спасибо
0
Эксперт Python
8851 / 4502 / 1864
Регистрация: 27.03.2020
Сообщений: 7,317
22.11.2020, 12:45
Вижу - у меня "квадрат"...
0
38 / 39 / 7
Регистрация: 13.11.2020
Сообщений: 678
22.11.2020, 12:46  [ТС]
Gdez, ограничение по времени к сожалению((
можно как нибудь ускорить? потому что все правильно но не проходит из за долгого выполнения
0
Эксперт Python
8851 / 4502 / 1864
Регистрация: 27.03.2020
Сообщений: 7,317
22.11.2020, 12:47
Ychenyi, можно
Как идея - проход find-ом по массиву с нахождением всех текущих минимумов
0
38 / 39 / 7
Регистрация: 13.11.2020
Сообщений: 678
22.11.2020, 12:48  [ТС]
Gdez, ускорьте пожалуйста
0
710 / 356 / 104
Регистрация: 09.02.2018
Сообщений: 805
22.11.2020, 12:49
Лучший ответ Сообщение было отмечено Ychenyi как решение

Решение

Исправил ошибку в своем решении:

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#import sys
 
#sys.stdin = open('input.txt', 'r')
n = int(input())
a = list(map(int, input().split()))
#sys.stdin.close()
 
ans = 0
heights_stack = [0]
height_max = max(a)
a.append(height_max)
 
for i in range(n + 1):
    hole_height = height_max - a[i]
    while hole_height < heights_stack[-1]:
        popped = heights_stack.pop()
        next_height = heights_stack[-1]
        if next_height < hole_height:
            next_height = hole_height
        ans += popped - next_height
        
    if hole_height > heights_stack[-1]:
        heights_stack.append(hole_height)
 
#sys.stdout = open('output.txt', 'w')
print(ans)
#sys.stdout.close()
3
0 / 0 / 0
Регистрация: 09.11.2020
Сообщений: 22
22.11.2020, 13:09
КулХацкеръ, алгоритм вроде очень простой, и я понял, как он работает, но хотелось бы услышать обьяснение его напрямую от автора, обьясните, пожалуйста, если вам не трудно.
0
Эксперт Python
8851 / 4502 / 1864
Регистрация: 27.03.2020
Сообщений: 7,317
22.11.2020, 13:09
КулХацкеръ,
Максимум слева
1
0 / 0 / 0
Регистрация: 09.11.2020
Сообщений: 22
22.11.2020, 13:22
Gdez, совсем нет же?
0
710 / 356 / 104
Регистрация: 09.02.2018
Сообщений: 805
22.11.2020, 15:00
Цитата Сообщение от Gger Посмотреть сообщение
алгоритм вроде очень простой, и я понял, как он работает, но хотелось бы услышать обьяснение его напрямую от автора, обьясните, пожалуйста, если вам не трудно.
Нет, не трудно. Хотя писал комментарии дольше, чем программу .

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
n = int(input())
a = list(map(int, input().split()))
#В переменной ans будем накапливать
#результат - суммарное количество
#блоков. Пока что сумма равна 0.
ans = 0
#В стек сразу кладем число 0. Это
#число никогда не будет извлекаться
#из стека, поскольку высота дыр
#в алгоритме >= 0. Значит, в стеке
#всегда будет как минимум 1 элемент
#и обращение к последнему элементу
#стека всегда будет безопасным.
heights_stack = [0]
#Находим максимальную высоту столбика
#в стакане.
height_max = max(a)
#Добавляем в стакан еще один столбик
#с максимальной высотой
#(распоследний), чтобы гарантировать,
#что после последнего столбика будет
#еще распоследний, и алгоритм
#опустошит стек полностью после
#обработки всех столбцов.
#Альтернатива - дополнительная
#проверка состояния стека после
#окончания алгоритма и его
#опустошение при необходимости.
#Но так короче.
a.append(height_max)
#Верхняя граница цикла не n, а n + 1,
#потому что мы добавили распоследний
#столбец.
for i in range(n + 1):
    #Находим высоту (или глубину? как
    #правильнее сказать?) дыры,
    #которую необходимо заполнить,
    #чтобы высота столбика стала
    #равной высоте самого высокого
    #столбика в стакане.
    hole_height = height_max - a[i]
    #Если мы видим, что дыры слева от
    #текущей по высоте (глубине)
    #превышают высоту текущей дыры,
    #то понимаем, что пора их
    #заполнить блоками, потому что
    #они уже все, ограничены
    #столбиками и слева, и справа.
    while hole_height < heights_stack[-1]:
        #Извлекли информацию о
        #глубине, на которую можно
        #погрузить очередной блок
        #слева.
        popped = heights_stack.pop()
        #Извлекли информацию о
        #следующей доступной глубине.
        next_height = heights_stack[-1]
        #Если следующая доступная
        #глубина меньше высоты
        #текущей дыры, то она
        #полностью ограничена
        #столбиком только слева, а
        #справа лишь частично,
        #поэтому заполняем ее только
        #до высоты текущей дыры.
        if next_height < hole_height:
            next_height = hole_height
        #Подсчитали количество блоков,
        #потраченных на заполнение
        #дыр слева, и добавили
        #к ответу.
        ans += popped - next_height
    #Если нашли дыру более высокую
    #(глубокую), чем текущая, то
    #нашли и еще один ограничивающий
    #наши дыры столбик слева.
    #Запоминаем информацию в стеке
    #для будущего использования.
    if hole_height > heights_stack[-1]:
        heights_stack.append(hole_height)
#В конце цикла натыкаемся на
#распоследний столбец, который имеет
#максимальную высоту и гарантированно
#ограничивает все дыры справа. Самое
#время заполнить все оставишеся дыры...
#...и вывести результат.
print(ans)
2
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
22.11.2020, 15:00
Помогаю со студенческими работами здесь

А какое минимальное число слагаемых потребуется, чтобы представить число 9002 в таком виде?
Число 2020 можно представить в виде суммы четырех различных чисел, каждое из которых записывается хотя бы двумя цифрами и все цифры в них...

Может ли король добраться к заданной клетке поля? За какое минимальное число шагов?
Есть задача: На шахматной доске размером M x M стоит белый король и P черных пешек. Пешки ходит не могут, а король ходит согластно...

Выведите одно число — какое минимальное число раз Вале придётся сложить письмо, чтобы она могла положить его в конверт
Валя устала от социальных сетей и решила написать своей подруге Саше письмо на прямоугольном листе бумаге. Длины сторон листа равны n и m...

Определить какое минимальное число зачётов следует сдать, чтобы закрыть сессию
Вот сама задача Вот мое решение: #include &lt;iostream&gt; #include &lt;map&gt; #include &lt;set&gt; #include &lt;vector&gt; #include...

Какое минимальное число поворотов сделать, чтобы шестеренки вернулись на исходное состояние
две сцепленные шестеренки. У одной n зубцов , у другой к.ТРебуеться найти какое минимальное число поворотов сделать, чтобы шестеренки...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Оттенки серого
Argus19 18.03.2026
Оттенки серого Нашёл в интернете 3 прекрасных модуля: Модуль класса открытия диалога открытия/ сохранения файла на Win32 API; Модуль класса быстрого перекодирования цветного изображения в оттенки. . .
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-rectangles-sdl3-c. zip finish-rectangles-sdl3-cpp. zip
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru