एक पार्किंग में ट्रक


10

पार्किंग स्थल में P पार्किंग स्थान हैं, हालांकि कुछ रिक्त स्थान ऑक्टोथॉर्प्स द्वारा प्रतिनिधित्व की गई कारों द्वारा कब्जा कर लिए गए हैं, #जबकि मुक्त स्थान डॉट्स हैं .। जल्द ही टी ट्रक आ जाएंगे, जिनमें से प्रत्येक बिल्कुल एल लगातार जगह लेगा। ट्रकों को एक-दूसरे के बगल में खड़ा नहीं करना पड़ता है।

आपका काम एक ऐसा प्रोग्राम बनाना है, जिसमें सभी ट्रकों को पार्क करने के लिए सबसे कम संख्या में कारों को निकालना होगा। सभी ट्रकों को फिट करने के लिए हमेशा पर्याप्त स्थान होगा, जिसका अर्थ हैT*L<P

इनपुट

पहली पंक्ति में तीन पूर्णांक, पी, टी और एल रिक्त स्थान से अलग होंगे। दूसरी पंक्ति में अपनी प्रारंभिक अवस्था में पार्किंग का प्रतिनिधित्व करने वाले 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]

एक सीधा डीपी दृष्टिकोण। कार्यक्रम का एक अच्छा हिस्सा सिर्फ इनपुट पढ़ रहा है।

व्याख्या

हम एक 2 डी गतिशील प्रोग्रामिंग टेबल की गणना करते हैं जहां प्रत्येक पंक्ति पहले nपार्किंग स्पॉट से मेल खाती है, और प्रत्येक कॉलम अब तक रखे गए ट्रकों (या एक ट्रक के कुछ हिस्सों) की संख्या से मेल खाती है। विशेष रूप से, स्तंभ का kअर्थ है कि हमने k//Lअभी तक पूर्ण ट्रक रखे हैं, और हम k%Lएक नए ट्रक के लिए रास्ते में हैं। प्रत्येक सेल राज्य तक पहुँचने के लिए स्पष्ट कारों की न्यूनतम संख्या है (n,k), और हमारा लक्ष्य राज्य है (P, L*T)

डीपी पुनरावृत्ति के पीछे का विचार निम्नलिखित है:

  • यदि हम 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 डालते हैं।

पायथ, 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]))
एटॉइन श्रादालु

@EtaoinShrdlu आसान हो सकता है अगर आप कोड को पास्टेबिन की तरह कहीं रख देते हैं तो इंडेंटेशन सही है। हालांकि मैं पायथन 3 की तरह दिखता है कि क्या देख सकते हैं, और एक तत्काल बचत हैQ=list(input()) -> *Q,=input()
Sp3000

हाँ, मैंने यह सहयोग करने की कोशिश की, लेकिन यह अभी नहीं चाहता था। हालांकि वास्तव में पास्टेबिन के बारे में नहीं सोचा था, हालांकि हेहट
एटन जॉन्डलू


@EoinoinShrdlu मुझे यकीन नहीं है कि आपका तर्क कैसे काम करता है, लेकिन कुछ अन्य चीजें जो आप कर सकते हैं 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, लॉट का आकार है।

संभवतः यहाँ गोल्फ के लिए बहुत कुछ बचा है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.