駐車場のトラック


10

駐車場にはP台の駐車スペースがありますが、一部のスペースはoctothorpesで表される車で占められてい#ますが、空きスペースはドット.です。すぐにTトラックが到着します。各トラックは、ちょうどL連続スペースを占めます。トラックは隣同士に駐車する必要はありません。

あなたの仕事は、すべてのトラックを駐車するために削除する必要がある車の最小数を見つけるプログラムを作成することです。すべてのトラックが収まる十分なスペースが常にあります。T*L<P

入力

最初の行には、スペースで区切られた3つの整数P、T、Lがあります。2行目には、初期状態の駐車場を表す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]

直接的なDPアプローチ。プログラムのかなりの部分は、入力を読み取るだけです。

説明

各行が最初のn駐車スポットに対応し、各列がこれまでに配置されたトラック(またはトラックのパーツ)の数に対応する2D動的プログラミングテーブルを計算します。特に、列とkは、これまでにk//Lフルトラックを配置k%Lし、新しいトラックを探していることを意味します。各セルは、状態に到達するためにクリアする車の最小数で(n,k)あり、目標の状態は(P, L*T)です。

DP再発の背後にある考え方は次のとおりです。

  • 私たちがk%L > 0新しいトラックのためのスペースである場合、私たちの唯一の選択肢はk%L-1、新しいトラックのためのスペースであることから来ることです
  • それ以外の場合k%L == 0は、新しいトラックを完成したばかりか、すでに最後のトラックを完成していて、それ以降いくつかの駐車場をスキップした場合です。2つのオプションのうち最小のものを使用します。

k > nつまり、駐車場の数よりも多くのトラック広場を配置した場合は、∞州に配置します(n,k)。ただしk、これはすべての車を削除する最悪のケースであり、上限としても機能するため、ゴルフの目的で使用します。

これは一口だったので、例を挙げてみましょう。

5 1 3
..##.

テーブルの最後の2行は

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

最後から2番目の行のインデックス2のエントリは2です。これは、2//3 = 0満杯のトラックが配置さ2%3 = 2れ、新しいトラック用のスペースになっている状態に到達するため、これが唯一のオプションです。

  TT
..XX

ただし、最後の2行目のインデックス3のエントリは1 です。新しいトラックを3//3 = 1配置するために満員のトラックが配置され、3%3 = 0そこにスペースがある状態に到達するには、最適なのは

TTT
..X#

最後の行のインデックス3のエントリは、上記の2つのセルをオプションとして表示します—新しいトラック用に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つ以上の変数に複数の割り当てを行った場合...


私はまったく別のことをやっていたと思いますが、時間があれば、どこでコードを削減できるか教えていただけます(正直に、私は印刷ステートメントだけの1行のソリューションが好きです...夢を見る。 ..) 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

ええ、私はこれを協力させようとしましたが、望んでいませんでした。
— でも


@EtaoinShrdluあなたのロジックがどのように機能するかはわかりませんが、他にできることは1)Q[j:j+L].count('#')変数としてx=l[i][1];del Q[x:x+L]
— 保存する

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はロットのサイズです。

たぶん、ここでゴルフに出かけた。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.