Camion in un parcheggio


10

Ci sono spazi di parcheggio P in un parcheggio, sebbene alcuni spazi siano occupati da automobili rappresentate da ottotorpe #mentre gli spazi liberi sono punti .. Presto arriveranno T camion, ognuno dei quali occuperà esattamente L spazi consecutivi. I camion non devono essere parcheggiati uno accanto all'altro.

Il tuo compito è quello di creare un programma che trovi il minor numero di auto che devono essere rimosse per parcheggiare tutti i camion. Ci saranno sempre abbastanza spazi per adattarsi a tutti i camion, il che significaT*L<P

Ingresso

Nella prima riga ci saranno tre numeri interi, P, T e L separati da spazi. Nella seconda riga ci sarà una serie di caratteri P che rappresentano il parcheggio nel suo stato iniziale.

Produzione

Nella prima e unica riga il programma dovrebbe stampare il minor numero di auto che devono essere rimosse per parcheggiare tutti i camion.

Casi test

Ingresso:
6 1 3
#.#.##

Produzione: 1

Ingresso:
9 2 3
.##..#..#

Produzione: 2

Ingresso:
15 2 5
.#.....#.#####.

Produzione: 3

Il codice più corto vince. (Nota: sono particolarmente interessato a un'implementazione Pyth, se possibile)

Risposte:


4

Python 2, 154 byte

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]

Un approccio DP semplice. Una buona parte del programma sta solo leggendo l'input.

Spiegazione

Calcoliamo una tabella di programmazione dinamica 2D in cui ogni riga corrisponde ai primi nparcheggi e ogni colonna corrisponde al numero di camion (o parti di un camion) posizionati finora. In particolare, colonna ksignifica che k//Lfinora abbiamo posizionato camion completi e siamo k%Lsulla strada per un nuovo camion. Ogni cella è quindi il numero minimo di auto da cancellare per raggiungere lo stato (n,k), e il nostro stato target è (P, L*T).

L'idea alla base della ricorrenza DP è la seguente:

  • Se siamo k%L > 0spazi per un nuovo camion, la nostra unica opzione è quella di essere k%L-1spazi per un nuovo camion
  • Altrimenti, se k%L == 0poi avessimo appena finito un nuovo camion o avessimo già finito l'ultimo camion e da allora abbiamo saltato alcuni parcheggi. Prendiamo il minimo delle due opzioni.

Se k > n, ad esempio, abbiamo piazzato più caselle di camion di quanti siano i parcheggi, allora mettiamo lo stato (n,k). Ma ai fini del golf, mettiamo kdal momento che questo è il caso peggiore di rimuovere ogni macchina, e serve anche come limite superiore.

Questo è stato un bel boccone, quindi facciamo un esempio, diciamo:

5 1 3
..##.

Le ultime due righe della tabella sono

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

La voce all'indice 2 della seconda ultima riga è 2, perché per raggiungere uno stato di 2//3 = 0camion pieni posizionati ed essere 2%3 = 2spazi per un nuovo camion, questa è l'unica opzione:

  TT
..XX

Ma l'ingresso all'indice 3 della seconda ultima riga è 1, perché per raggiungere uno stato di 3//3 = 1camion pieni posizionati ed essere 3%3 = 0spazi per un nuovo camion, l'ottimale è

TTT
..X#

La voce all'indice 3 dell'ultima riga considera le due celle sopra come opzioni: prendiamo il caso in cui ci sono 2 spazi per un nuovo camion e lo finiamo, oppure prendiamo il caso in cui abbiamo un camion pieno Già finito?

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

Chiaramente quest'ultimo è meglio, quindi mettiamo giù un 1.

Pyth, 70 byte

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

Fondamentalmente una porta del codice sopra. Non molto ancora golfato. Provalo online

allargato

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]])

Ora, se solo Pyth avesse assegnazioni multiple a> 2 variabili ...


Stavo facendo qualcosa di completamente diverso, penso .. ma se hai tempo, puoi dirmi dove posso ridurre il codice (onestamente mi piacerebbe una soluzione a una riga con solo una dichiarazione stampata ... sogni da sogno. ..) 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]))
Etaoin Shrdlu,

@EtaoinShrdlu Potrebbe essere più semplice se metti il ​​codice da qualche parte come Pastebin in modo che il rientro sia corretto. Da quello che posso vedere sembra Python 3 e un salvataggio immediato èQ=list(input()) -> *Q,=input()
Sp3000,

sì, ho provato a far cooperare questo, ma proprio non volevo. non pensava davvero al pastebin sebbene heh
Etaoin Shrdlu il


@EtaoinShrdlu Non sono sicuro di come funzioni la tua logica, ma alcune altre cose che puoi fare sono 1) Memorizza Q[j:j+L].count('#')come variabile, 2) x=l[i][1];del Q[x:x+L],
Sp3000

3

Haskell, 196 caratteri

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

Esegue tutti gli esempi

& (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

Un po 'lento: O (2 ^ P) dove P è la dimensione del lotto.

Probabilmente molto lasciato al golf qui.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.