একটি পার্কিং লট ট্রাক


10

একটি পার্কিং স্থানে পি পার্কিং স্পেস রয়েছে, যদিও কিছু স্পেস অষ্টকোষ দ্বারা প্রতিনিধিত্ব করা গাড়ি দ্বারা দখল করা হয়েছে #এবং ফ্রি স্পটগুলি বিন্দু রয়েছে .। খুব শীঘ্রই সেখানে টি ট্রাক আসবে, যার মধ্যে প্রতিটি পরপর ঠিক এল স্থান গ্রহণ করবে। ট্রাকগুলি একে অপরের পাশে পার্কিং করতে হবে না।

আপনার কাজ হ'ল এমন একটি প্রোগ্রাম তৈরি করা যা সর্বাধিক সংখ্যক গাড়ি সন্ধান করবে যা সমস্ত ট্রাককে পার্ক করার জন্য অপসারণ করা দরকার। সবসময় ট্রাকের পুরোপুরি ফিট করার জন্য পর্যাপ্ত জায়গা থাকবে meaningT*L<P

ইনপুট

প্রথম সারিতে তিনটি পূর্ণসংখ্যা থাকবে, পি, টি এবং এল ফাঁকা দ্বারা পৃথক করা। দ্বিতীয় সারিতে পি অক্ষরের একটি স্ট্রিং থাকবে যার প্রাথমিক অবস্থায় পার্কিংয়ের প্রতিনিধিত্ব করবে।

আউটপুট

প্রথম এবং একমাত্র লাইনে আপনার প্রোগ্রামটিতে সমস্ত ট্রাকে পার্ক করার জন্য সর্বাধিক সংখ্যক গাড়ি মুদ্রণ করা উচিত।

পরীক্ষার মামলা

ইনপুট:
6 1 3
#.#.##

আউটপুট: 1

ইনপুট:
9 2 3
.##..#..#

আউটপুট: 2

ইনপুট:
15 2 5
.#.....#.#####.

আউটপুট: 3

সংক্ষিপ্ততম কোড জিতেছে। (দ্রষ্টব্য: আমি একটি পাইথ বাস্তবায়নে বিশেষভাবে আগ্রহী, যদি এটি সম্ভব হয়)

উত্তর:


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]

একটি সোজা ডিপি পদ্ধতির। প্রোগ্রামটির ন্যায্য অংশটি কেবল ইনপুট পড়া reading

ব্যাখ্যা

আমরা একটি 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]])

এখন, যদি পাইথের কাছে> 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]))
এতাoinইন শারদলু

@ এটয়ইনশার্ডলু যদি আপনি পাস্তবিনের মতো কোথাও কোডটি রেখে দেন তবে ইন্ডেন্টেশনটি সঠিক। পাইথন 3 এর মতো দেখতে দেখতে আমি যা দেখতে পাচ্ছি এবং তার তাত্ক্ষণিক Q=list(input()) -> *Q,=input()
সঞ্চয়টি

হ্যাঁ, আমি এই সহযোগিতা করার চেষ্টা করেছি, তবে এটি কেবল চায়নি। যদিও তিনি পেস্টবিনের কথা সত্যই ভাবেন নি
এতাওইন শারদলু

এখানে এটি পেস্টবিন.
com/ugv4zujB

@ এটেইনশার্ডলু আপনার লজিক কীভাবে কাজ করে তা আমি নিশ্চিত নই, তবে আপনি করতে পারেন এমন অন্যান্য কিছু 1) Q[j:j+L].count('#')ভেরিয়েবল হিসাবে সঞ্চয় করুন , 2) x=l[i][1];del Q[x:x+L],
স্প 3000

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) পি হ'ল লটের আকার।

সম্ভবত গল্ফ এখানে প্রচুর বাকি।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.