停车场的卡车


10

停车场中有P个停车位,尽管有些空间被以八面兽#为代表的汽车占据,而自由空间是点.。很快就有T卡车抵达,每辆卡车将恰好占据L个连续的空间。卡车不必彼此相邻停放。

您的任务是创建一个程序,该程序将找到需要停放以停放所有卡车的最少数量的汽车。总是会有足够的空间来容纳所有卡车,这意味着T*L<P

输入值

在第一行中,将有三个整数,P,T和L由空格分隔。在第二行中,将出现一串P字符,它们代表处于初始状态的停车场。

输出量

在第一行也是唯一的一行中,您的程序应打印出需要停放以停放所有卡车的最少数量的汽车。

测试用例

输入:
6 1 3
#.#.##

输出: 1

输入:
9 2 3
.##..#..#

输出: 2

输入:
15 2 5
.#.....#.#####.

输出: 3

最短的代码获胜。(注意:如果可能的话,我对pyth实现特别感兴趣)

Answers:


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]

一种直接的DP方法。该程序的相当一部分只是读取输入。

说明

我们计算一个二维动态规划表,其中每一行对应于第一个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的条目将上述两个单元格视为选项-我们是假设我们有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 2015年

@EtaoinShrdlu如果将代码粘贴到Pastebin之类的地方,可能会更容易,因此缩进是正确的。从我所看到的虽然看起来像Python 3,并且立即保存为Q=list(input()) -> *Q,=input()
Sp3000,2015年

是的,我试图让这种合作,但只是不想。没真正想起pastebin吧
Etaoin Shrdlu 2015年


@EtaoinShrdlu我不确定您的逻辑如何工作,但是您可以做的其他一些事情是1)存储Q[j:j+L].count('#')为变量,2)x=l[i][1];del Q[x:x+L]
Sp3000

3

Haskell,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是手数的大小。

这里可能剩下很多高尔夫球场。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.