Xe tải trong bãi đậu xe


10

Có chỗ đậu xe P trong một bãi đậu xe, mặc dù một số không gian bị chiếm bởi những chiếc xe được đại diện bởi octothorpes #trong khi không gian trống là dấu chấm .. Sẽ sớm có xe tải T đến, mỗi chiếc sẽ chiếm chính xác L không gian liên tiếp. Những chiếc xe tải không phải đậu cạnh nhau.

Nhiệm vụ của bạn là tạo ra một chương trình sẽ tìm ra số lượng xe nhỏ nhất cần phải loại bỏ để đỗ tất cả các xe tải. Sẽ luôn có đủ không gian để phù hợp với tất cả các xe tải, có nghĩa làT*L<P

Đầu vào

Ở hàng đầu tiên sẽ có ba số nguyên, P, T và L cách nhau bởi khoảng trắng. Ở hàng thứ hai sẽ có một chuỗi các ký tự P đại diện cho bãi đậu xe ở trạng thái ban đầu.

Đầu ra

Trong dòng đầu tiên và duy nhất, chương trình của bạn nên in ra số lượng xe nhỏ nhất cần phải loại bỏ để đỗ tất cả các xe tải.

Các trường hợp thử nghiệm

Đầu vào:
6 1 3
#.#.##

Đầu ra: 1

Đầu vào:
9 2 3
.##..#..#

Đầu ra: 2

Đầu vào:
15 2 5
.#.....#.#####.

Đầu ra: 3

Mã ngắn nhất sẽ thắng. (Lưu ý: Tôi đặc biệt quan tâm đến việc triển khai pyth, nếu có thể)

Câu trả lời:


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]

Một cách tiếp cận DP đơn giản. Một đoạn công bằng của chương trình chỉ là đọc đầu vào.

Giải trình

Chúng tôi tính toán một bảng lập trình động 2D trong đó mỗi hàng tương ứng với các nđiểm đỗ xe đầu tiên và mỗi cột tương ứng với số lượng xe tải (hoặc các bộ phận của xe tải) được đặt cho đến nay. Cụ thể, cột kcó nghĩa là chúng tôi đã đặt k//Lxe tải đầy đủ cho đến nay và chúng tôi đang k%Ltrên đường cho một chiếc xe tải mới. Mỗi ô sau đó là số lượng ô tô tối thiểu để xóa để đạt đến trạng thái (n,k), và trạng thái mục tiêu của chúng tôi là (P, L*T).

Ý tưởng đằng sau sự tái phát của DP là như sau:

  • Nếu chúng ta có k%L > 0không gian cho một chiếc xe tải mới, thì lựa chọn duy nhất của chúng ta là đến từ những k%L-1không gian cho một chiếc xe tải mới
  • Mặt khác, nếu k%L == 0sau đó chúng tôi vừa hoàn thành một chiếc xe tải mới, hoặc chúng tôi đã hoàn thành chiếc xe tải cuối cùng và từ đó đã bỏ qua một vài điểm đỗ xe. Chúng tôi có tối thiểu của hai lựa chọn.

Nếu k > n, tức là chúng ta đã đặt nhiều ô vuông xe tải hơn chỗ đỗ xe, thì chúng ta sẽ đặt trạng thái (n,k). Nhưng với mục đích chơi gôn, chúng tôi đặt ra kvì đây là trường hợp xấu nhất trong việc loại bỏ mọi chiếc xe, và cũng đóng vai trò là giới hạn trên.

Điều này khá là ngon miệng, vì vậy hãy có một ví dụ, nói:

5 1 3
..##.

Hai hàng cuối cùng của bảng là

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

Mục nhập tại chỉ số 2 của hàng cuối cùng thứ hai là 2, vì để đạt đến trạng thái 2//3 = 0đầy đủ các xe tải được đặt và là 2%3 = 2khoảng trống cho một xe tải mới, đây là lựa chọn duy nhất:

  TT
..XX

Nhưng mục nhập ở chỉ số 3 của hàng cuối cùng thứ hai là 1, bởi vì để đạt đến trạng thái 3//3 = 1đầy đủ các xe tải được đặt và là 3%3 = 0khoảng trống cho một xe tải mới, tối ưu là

TTT
..X#

Mục nhập ở chỉ số 3 của hàng cuối cùng xem hai ô ở trên là các tùy chọn - chúng ta có chọn trường hợp chúng ta có 2 khoảng trống cho một chiếc xe tải mới và kết thúc nó không, hoặc chúng ta lấy trường hợp chúng ta có một chiếc xe tải đầy đủ đã xong chưa

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

Rõ ràng cái sau tốt hơn, vì vậy chúng tôi đặt xuống 1.

Bình thường, 70 byte

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

Về cơ bản là một cổng của mã trên. Chưa chơi golf tốt lắm. Dùng thử trực tuyến

Mở rộng

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

Bây giờ, nếu chỉ Pyth có nhiều phép gán cho> 2 biến ...


Tôi đã làm một cái gì đó hoàn toàn khác, tôi nghĩ rằng .. nhưng nếu bạn có thời gian, bạn có thể cho tôi biết nơi tôi có thể cắt giảm mã (thành thật mà nói tôi yêu một giải pháp một dòng chỉ với một câu lệnh in .. mơ những giấc mơ. ..) 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 Có thể dễ dàng hơn nếu bạn đặt mã lên một nơi nào đó như Pastebin để thụt lề chính xác. Từ những gì tôi có thể thấy mặc dù trông giống Python 3 và tiết kiệm ngay lập tức làQ=list(input()) -> *Q,=input()
Sp3000

Vâng, tôi đã cố gắng để hợp tác này, nhưng nó không muốn. không thực sự nghĩ về pastebin mặc dù heh
Etaoin Shrdlu


@EtaoinShrdlu Tôi không chắc logic của bạn hoạt động như thế nào, nhưng một số điều khác bạn có thể làm là 1) Lưu trữ Q[j:j+L].count('#')dưới dạng một biến, 2) x=l[i][1];del Q[x:x+L],
Sp3000

3

Haskell, 196 ký tự

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

Chạy tất cả các ví dụ

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

Hơi chậm: O (2 ^ P) là P là kích thước của lô.

Có lẽ còn nhiều để chơi golf ở đây.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.