لینک‌های مفید برای شرکت در مسابقه:

راه‌حل‌ها و راهنمایی‌های نهایی اضافه شدند.
این راهنمایی‌ها را می‌توانید در انتهای سوالات مشاهده کنید.
. می‌توانید سوالات خود را از قسمت "سوال بپرسید" مطرح کنید.

دریچه


  • محدودیت زمان: ۳ ثانیه
  • محدودیت حافظه: ۲۵۶ مگابایت

آرایه aa، شامل اعداد a1,a2,...,an a_1, a_2, ..., a_n\ روی تخته نوشته شده است. در هر گام می‌توانیم یکی از دو عملیات زیر را انجام دهیم.

  • یک عدد xx از روی تخته در نظر بگیریم و تمام اعداد xx روی تخته را با x2\left \lfloor{ \frac {x}{2}}\right \rfloor جایگزین کنیم. (یعنی به جای هر xx روی تخته، x2\left \lfloor{ \frac {x}{2}}\right \rfloor قرار می‌دهیم.‌)
  • یک عدد xx از روی تخته در نظر بگیریم و تمام اعداد xx روی تخته را پاک کنیم.

از عملیات نوع دوم حداکثر kk بار می‌توانیم استفاده کنیم.

کم‌ترین تعداد مرحله برای این که در انتها کلا عددی روی تخته باقی نماند، یا تمامی اعداد باقی مانده برابر با 00 باشد، چه‌قدر است؟

ورودی🔗

ورودی شامل دو خط است که خط اول آن شامل دو عدد n,kn, k است.

در خط دوم nn عدد a1,a2,..,an a_1, a_2, .., a_n\ می‌آید که اعداد اولیه روی تخته را مشخص می‌کند.

1n100 0001 \le n \le 100\ 000 0k100 \le k \le 10 1ai1091 \le a_i \le 10^9

خروجی🔗

در تنها خط خروجی کمترین مراحل مورد نیاز برای رسیدن به شرایط مطلوب را چاپ کنید.

مثال🔗

ورودی نمونه ۱🔗

5 2
1 2 3 4 5
Plain text

خروجی نمونه ۱🔗

5
Plain text

یکی از روش‌ها این است که ابتدا اعداد 55 و 44 را با عملیات نوع اول به 22 تبدیل کنیم. سپس عدد 33 را به 11 تبدیل کنیم، اعداد روی تخته <1,2,1,2,2><1, 2, 1, 2, 2> خواهند بود. در نهایت عدد 1,21, 2 را پاک کنیم و دنباله تهی می‌شود. در مجموع 55 عملیات انجام شده است.

ورودی نمونه ۲🔗

4 1
1 1 2 3
Plain text

خروجی نمونه ۲🔗

3
Plain text

در یکی از روش‌های بهینه ابتدا عدد 33 را حذف می‌کنیم،‌ سپس 22 را با عملیات اول به 11 تبدیل می‌کنیم و نهایتا همه اعداد 11 را با عملیات اول به صفر تبدیل می‌کنیم.

ورودی نمونه ۳🔗

10 3
10 20 30 40 50 60 70 80 90 100
Plain text

خروجی نمونه ۳🔗

16
Plain text

راهنمایی ۱

در این بخش فرض کنید k=0k=0 است.

نمایش باینری اعداد را در نظر بگیرید، با عملیات اول آخرین رقم نمایش دودویی حذف می‌شود. اکنون درخت ترای اعداد آرایه را در نظر بگیرید، هدف این است که با حذف آخرین رقم همه اعداد را به صفر تبدیل کنیم که یعنی درخت ترای اعدادمان را تک راسی کنیم، پس می‌توان دریافت که به حداقل به اندازه تعداد راس‌های ترای منهای یک، عملیات نیاز داریم، چون در هر عملیات حداکثر یک راس حذف می‌شود.

همین‌طور می‌توان روشی ارائه داد تا با دقیقا همین تعداد عملیات، همه اعداد را به صفر تبدیل کنیم.

پس مساله در حالت k=0k=0، حل شد. سعی کنید با همین ایده مساله را برای k>0k>0 حل کنید.

راهنمایی ۲

در این بخش به بیان ایده حالت کلی مساله می‌پردازیم.

با استفاده از برنامه‌نویسی پویا روی درخت ترای مساله را حل می‌کنیم. فرض کنید بخواهیم برای هر راس در درخت ترای مثل vv (که متناظر با یک عدد است) ، مساله را برای اعداد درون زیردرخت آن راس حل کنیم، یعنی بخواهیم با jj عملیات حذف 1jk1 \le j \le k ، اعداد درون زیردرخت vv را به vv تبدیل کنیم.

برای محاسبه این مقادیر به این نتیجه می‌رسیم که لازم است روی این که آیا همه اعداد زیردرخت حذف شده‌اند یا خیر حالت‌بندی کنیم در نتیجه لازم است آرایه dpdpای‌داشته باشیم که dp[v][j][t]dp[v][j][t] کمترین تعداد عملیات‌های نوع اول لازم برای اینکه اعداد درون زیردرخت vv را به vv تبدیل کنیم و حداکثر jj بار ار عملیات حذف استفاده کنیم. هم‌چنین اگر t=0t=0 تضمین می‌شود که همه اعداد درون این زیردرخت حذف شده‌اند و هیچ عددی باقی نمانده است و درحالت t=1t=1، ممکن است تعدادی از اعداد (طبیعتا همگی vv هستند)، باقی بمانند.

راه حل

در این بخش شیوه پرکردن آرایه dpdp را شرح می‌دهیم.

فرض کنید بخواهیم dp[v][j][t]dp[v][j][t] را محاسبه کنیم.

فرزند چپ vv را vlv_l و فرزند راست آن‌ را vrv_r بنامید.

حالت بندی کنید که چه تعداد عملیات حذف را در زیردرخت vlv_l و چه تعداد را در زیر درخت vrv_r استفاده کنیم، هم‌چنین با حالت بندی روی اینکه در هر کدام از زیردرخت‌ها کل اعداد حذف شده‌اند یا خیر، می‌توان دریافت که یک عملیات اضافه برای تبدیل vlv_l و یا vrv_r به vv نیاز داریم یا خیر.

هم‌چنین یک حالت این است که روی vv عملیات حذف را انجام دهیم که نباید آن را فراموش کنید.

در نهایت پیچیدگی نهایی حل این مساله θ(nk2log2Ai)\theta (n k^2 \log_2 A_i) خواهد بود.

ارسال پاسخ برای این سؤال
در حال حاضر شما دسترسی ندارید.