주차장에서 트럭


10

주차장에는 P 개의 주차 공간이 있지만 일부 공간은 옥토 소프로 표시되는 자동차가 차지하지만 #자유 공간은 점 .입니다. 곧 T 트럭이 도착하는데, 각각의 트럭은 정확히 L 연속 공간을 차지합니다. 트럭을 나란히 주차 할 필요는 없습니다.

당신의 임무는 모든 트럭을 주차하기 위해 제거 해야하는 가장 적은 수의 자동차를 찾을 수있는 프로그램을 만드는 것입니다. 모든 트럭에 맞는 공간이 항상 충분합니다.T*L<P

입력

첫 번째 행에는 공백으로 구분 된 세 개의 정수 P, T 및 L이 있습니다. 두 번째 행에는 주차장의 초기 상태를 나타내는 P 문자 문자열이 있습니다.

산출

첫 번째 및 유일한 줄에서 프로그램은 모든 트럭을 주차하기 위해 제거해야하는 가장 적은 수의 자동차를 인쇄해야합니다.

테스트 사례

입력:
6 1 3
#.#.##

산출: 1

입력:
9 2 3
.##..#..#

산출: 2

입력:
15 2 5
.#.....#.#####.

산출: 3

가장 짧은 코드가 승리합니다. (참고 : 가능한 경우 pyth 구현에 특히 관심이 있습니다)

답변:


4

파이썬 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]

간단한 DP 접근법. 프로그램의 공정한 덩어리는 단지 입력을 읽는 것입니다.

설명

각 행이 첫 번째 n주차 지점에 해당하고 각 열이 지금까지 배치 한 트럭 (또는 트럭의 일부)의 수에 해당 하는 2D 동적 프로그래밍 테이블을 계산합니다 . 특히 열 kk//L지금까지 전체 트럭을 배치 k%L했으며 새 트럭을 찾는 단계라는 의미입니다. 그런 다음 각 셀은 주에 도달 할 수있는 최소 차량 수이며 (n,k)목표 상태는 (P, L*T)입니다.

DP 재발의 기본 개념은 다음과 같습니다.

  • 우리가 k%L > 0새로운 트럭을위한 공간 이라면 , 우리의 유일한 선택은 k%L-1새로운 트럭을위한 공간 이되는 것 입니다.
  • 그렇지 않으면 k%L == 0우리가 방금 새 트럭을 완성했거나 이미 마지막 트럭을 완성한 후 몇 개의 주차 지점을 건너 뛰었습니다. 우리는 두 가지 옵션 중 최소한을 취합니다.

k > n즉, 주차 지점보다 더 많은 트럭 광장을 배치 한 경우 state로 설정 (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에있는 항목은 위의 두 셀을 옵션으로 간주합니다. 새 트럭에 대해 2 칸의 공간을 차지하고 마무리하거나 트럭이 가득 찬 경우를 처리합니까? 이미 끝났다?

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

@EtaoinShrdlu Pastebin과 같은 곳에 코드를 넣으면 들여 쓰기가 정확할 수 있습니다. 내가 볼 수 있듯이 파이썬 3처럼 보이고 즉각적인 절약은Q=list(input()) -> *Q,=input()
Sp3000

그래, 나는 이것을 협조하려고 노력했지만 그것을 원하지 않았다. 그는 실제로 pastebin을 생각하지 않았다
Etaoin Shrdlu


@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가 로트의 크기입니다.

아마 골프에 남아있을 것입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.