รถบรรทุกในลานจอดรถ


10

มีที่จอดรถ P ในลานจอดรถมี แต่พื้นที่บางส่วนมีการครอบครองโดยรถยนต์ตัวแทนจาก octothorpes ในขณะที่ช่องว่างฟรีจุด# .ในไม่ช้าก็มีรถบรรทุก T มาถึงแต่ละอันจะใช้พื้นที่ L ติดต่อกันอย่างแน่นอน รถบรรทุกไม่จำเป็นต้องจอดอยู่ติดกัน

งานของคุณคือการสร้างโปรแกรมที่จะค้นหาจำนวนรถยนต์ที่เล็กที่สุดที่ต้องถูกลบออกเพื่อจอดรถบรรทุกทั้งหมด จะมีพื้นที่เพียงพอที่จะรองรับรถบรรทุกทุกคันได้อย่างมีความหมายT*L<P

อินพุต

ในแถวแรกจะมีจำนวนเต็มสามตัวคือ P, T และ L คั่นด้วยช่องว่าง ในแถวที่สองจะมีสตริงของอักขระ 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 ที่ตรงไปตรงมา ชิ้นอันยุติธรรมของโปรแกรมเป็นเพียงการอ่านอินพุต

คำอธิบาย

เราคำนวณตารางการเขียนโปรแกรมแบบไดนามิก 2D ซึ่งแต่ละแถวตรงกับที่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

@EtaoinShrdlu อาจจะง่ายกว่านี้ถ้าคุณวางโค้ดไว้ที่อื่นเช่น Pastebin เพื่อให้การเยื้องนั้นถูกต้อง จากสิ่งที่ฉันเห็นว่ามันดูเหมือน Python 3 และการประหยัดทันทีคือQ=list(input()) -> *Q,=input()
Sp3000

ใช่ฉันพยายามที่จะให้ความร่วมมือนี้ แต่มันก็ไม่ต้องการ ไม่ได้นึกถึง
Pastebin จริงๆเหรอ


@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 คือขนาดของล็อต

น่าจะมีมากมายเหลือให้เล่นกอล์ฟที่นี่

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.