Вантажівки на стоянці


10

На парковці є паркувальні місця, хоча деякі місця займають машини, представлені октоторпами, #а вільні місця - крапками .. Незабаром прибудуть T вантажівок, кожна з яких займе рівно L послідовних просторів. Вантажівки не повинні стояти поруч.

Ваше завдання - створити програму, яка знайде найменшу кількість автомобілів, які потрібно вивезти для паркування всіх вантажних автомобілів. Завжди буде достатньо місця, щоб помістити всі вантажівки, значитьT*L<P

Вхідні дані

У першому ряду будуть три цілі числа, P, T і L, розділені пробілами. У другому ряду буде рядок з P символів, що представляють стоянку в початковому стані.

Вихідні дані

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

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

Вхід:
6 1 3
#.#.##

Вихід: 1

Вхід:
9 2 3
.##..#..#

Вихід: 2

Вхід:
15 2 5
.#.....#.#####.

Вихід: 3

Найкоротший код виграє. (Примітка. Мене особливо цікавить реалізація pyth, якщо така можлива)

Відповіді:


4

Python 2, 154 байти

I,R=raw_input,range
P,T,L=map(int,I().split())
S=I()
D=R(P+1)
for r in R(P):D[1:r+2]=[min([D[c],D[c-1]+(S[r]<".")][c%L>0:])for c in R(1,r+2)]
print D[T*L]

Прямий підхід ДП. Справедливий фрагмент програми - це лише читання матеріалів.

Пояснення

Ми обчислюємо 2D динамічну таблицю програмування, де кожен рядок відповідає першим nмісцям паркування, а кожен стовпець відповідає кількості розміщених на даний момент вантажівок (або частин вантажівки). Зокрема, стовпець kозначає, що ми поки що розмістили k//Lповні вантажні автомобілі, і ми йдемо k%Lпо шляху нової вантажівки. Кожна клітина - це мінімальна кількість автомобілів, яку потрібно зрозуміти, щоб досягти стану (n,k), і наш цільовий стан (P, L*T).

Ідея рецидиву DP полягає в наступному:

  • Якщо ми пропонуємо k%L > 0нову вантажівку, то наш єдиний варіант - це те, що ми не були k%L-1місцями для нової вантажівки
  • Інакше якщо k%L == 0тоді ми або щойно закінчили нову вантажівку, або ми вже закінчили останню вантажівку і з тих пір пропустили кілька паркувальних місць. Ми беремо мінімум з двох варіантів.

Якщо k > n, наприклад, ми розмістили більше квадратів для вантажних автомобілів, ніж місць для паркування, то ми ставимо для держави (n,k). Але для цілей гольфу ми поставимо, kоскільки це найгірший випадок зняття кожної машини, а також служить верхньою межею.

Це було досить ситно, тому давайте приклад, скажімо:

5 1 3
..##.

Останні два ряди таблиці

[0, 1, 2, 1, 2, ∞]
[0, 0, 1, 1, 1, 2]

Запис в індексі 2 другого останнього ряду - 2, оскільки для досягнення стану 2//3 = 0повного розміщення вантажівок та 2%3 = 2місця для нової вантажівки, це єдиний варіант:

  TT
..XX

Але запис в індексі 3 другого останнього ряду - 1, оскільки для досягнення стану 3//3 = 1повних вантажних автомобілів та 3%3 = 0місця для нової вантажівки оптимальним є

TTT
..X#

Запис у індексі 3 останнього рядка розглядає вищезазначені дві клітини як варіанти - чи візьмемо ми випадок, коли ми знаходимось на два пробіли для нової вантажівки, і закінчимо її, чи візьмемо випадок, коли у нас є повна вантажівка вже закінчили?

  TTT            TTT
..XX.     vs     ..X#.

Очевидно, що останнє краще, тому ми відкладаємо 1.

Pyth, 70 байт

JmvdczdKw=GUhhJVhJ=HGFTUhN XHhThS>,@GhT+@GTq@KN\#>%hT@J2Z)=GH)@G*@J1eJ

В основному порт вищевказаного коду. Ще не дуже добре гольф. Спробуйте в Інтернеті

Розширено

Jmvdczd              J = map(eval, input().split(" "))
Kw                   K = input()
=GUhhJ               G = range(J[0]+1)
VhJ                  for N in range(J[0]):
=HG                    H = G[:]
FTUhN                  for T in range(N+1):
 XHhT                    H[T+1] =
hS                                sorted(                                        )[0]
>                                                                 [            :]
,                                        (      ,                )
@GhT                                      G[T+1]
+@GTq@KN\#                                       G[T]+(K[N]=="#")
>%hT@J2Z                                                           (T+1)%J[2]>0
)=GH                   G = H[:]
)@G*@J1eJ            print(G[J[1]*J[-1]])

Тепер, якби тільки Pyth мав декілька присвоєнь> 2 змінним ...


Я робив щось зовсім інше, я думаю .. але якщо у вас є час, ви можете сказати мені, де я можу скоротити код (чесно кажучи, я хотів би однорядне рішення з просто друкованою заявою .. мрії мрії. ..) P,K,L=map(int,input().split()) Q=list(input()) l=[(L,0)]*K for j in range(len(Q)-L): if Q[j:j+L].count('#')<l[i][0]: l[i]=Q[j:j+L].count('#'),j del Q[l[i][1]:l[i][1]+L] print(sum([x[0]for x in l]))
Етаоін Шрдлу

@EtaoinShrdlu Можливо, буде простіше, якщо ви поставите код де-небудь, як Pastebin, щоб відступ було правильним. З того, що я можу побачити, це схоже на Python 3, і негайне збереженняQ=list(input()) -> *Q,=input()
Sp3000

так, я намагався змусити це співпрацювати, але цього просто не хотілося. Не дуже думав про пастебін, хоча хе
Етаоін Шрдлу,


@EtaoinShrdlu Я не впевнений, як працює ваша логіка, але деякі інші речі ви можете зробити: 1) Зберігати Q[j:j+L].count('#')як змінну, 2) x=l[i][1];del Q[x:x+L],
Sp3000

3

Хаскелл, 196 символів

import Data.List
f=filter
m=map
q[_,t,l]=f((>=t).sum.m((`div`l).length).f(>"-").group).sequence.m(:".")
k[a,p]=minimum.m(sum.m fromEnum.zipWith(/=)p)$q(m read$words a)p
main=interact$show.k.lines

Виконує всі приклади

& (echo 6 1 3 ; echo "#.#.##" )  | runhaskell 44946-Trucks.hs 
1

& (echo 9 2 3 ; echo ".##..#..#" )  | runhaskell 44946-Trucks.hs 
2

& (echo 15 2 5 ; echo ".#.....#.#####." )  | runhaskell 44946-Trucks.hs 
3

Дещо повільно: O (2 ^ P) були P - розмір партії.

Напевно, тут залишилось багато для гольфу.

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