====== Shelter ====== ‎$n$‎ نفر در مکان‌های ‎$a_2$‎ ، ‎$a_1$‎ تا ‎$a_n$‎ مختصات قرار دارند. می‌خواهیم این ‎$n$‎ نفر را به ‎$m$‎ پناهگاه ببریم طوری که مجموع اندازه‌ای که افراد حرکت می‌کنند کمینه شود و درون هر پناهگاه حداقل یک نفر وجود داشته باشد‎. ‎ می‌دانیم پناهگاه ‎$i$‎ در مکان ‎$b_i$‎ محور مختصات قرار دارد‎. ‎ شما باید برنامه‌ای بنویسید که کم‌ترین میزان حرکت افراد را به دست آورد، طوری که شرایط سؤال برقرار باشد. ‎‎ ===== ورودی ===== * در سطر اول ورودی عدد ‎$1 \leq n \leq 4000$‎ آمده است. در سطر بعدی ‎$n$‎ عدد ‎$a_1$‎ تا ‎$a_n$‎ آمده است‎. * در سطر سوم ورودی عدد ‎$1 \leq m \leq n$‎ آمده است. در سطر بعدی ‎$m$‎ عدد ‎$b_1$‎ تا ‎$b_m$‎ آمده است‎. ===== خروجی ===== در تنها سطر خروجی پاسخ سوال را چاپ نمایید. ‎ ===== محدودیت‌ها ===== * محدودیت زمان: ۲ ثانیه * محدودیت حافظه: ۲۵۶ مگابایت ===== ورودي و خروجي نمونه ===== ^ ورودي نمونه ^ خروجي نمونه ^ |3 \\ 1 2 3‎ \\ 2 \\ 2 10 | ‎8‎ | ‎<پاسخ> ادعا می‌کنیم جواب بهینه‌ای وجود دارد که در آن اگر ‎$m$‎ پناهگاه و ‎$n$‎ آدم را بر حسب مکانشان مرتب کنیم و شماره‌گذاری کنیم، به ازای هر ‎$i$‎ خاصیت زیر برقرار است: ‎‎ * ‎ بین تمام آدم‌هایی که به ‎$i$‎ پناهگاه اول می‌روند کسی که بیش‌ترین ‎id‎ را دارد در نظر گرفته مثلا ‎$k$‎ می‌گوییم ‎$i$‎ پناهگاهی خوب است اگر و فقط اگر ‎$k$‎ نفر اول همه به ‎$i$‎ پناهگاه اول رفته باشند. پس ادعا می‌کنیم جواب بهینه‌ای وجود دارد که در آن همه‌ی پناهگاه‌ها خوب‌اند. برای اثبات از برهان خلف استفاده کرده. جواب بهینه‌ای را در نظر بگیرید که بیش‌ترین پناهگاه خوب را دارد. اولین پناهگاه غیرخوب را ‎j‎ می‌نامیم و بزرگ‌ترین کسی که به ‎$j$‎ پناهگاه اول رفته را ‎$i$‎ می‌نامیم. بنابراین کسی وجود دارد قبل از ‎$i$‎ مثلا ‎$k$‎ که به پناهگاهی بعد از پناهگاه ‎$j$‎ رفته ‎$k j)$ ‎ نفر ‎$i$‎ ام حتما باید به ‎$j$‎ برود حالا باید برای ‎$i-1$‎ نفر که پناهگاه ‎$j$‎ ام می تواند خالی باشد‎! ‎ ‎$DPtemp[i][j] = min(DPcomplete[i][j-1]‎ + ‎Cost(i‎ -‎> j-1)‎, ‎DPtemp[i-1][j-1]‎ + ‎Cost(i‎ -‎> j))$ ‎ نفر ‎$i$‎ ام می‌تواند به ‎$j$‎ یا ‎$j-1$‎ برود‎. ‎ ‎**پيچيدگي** ‎ مرتب کردن اعداد که از ‎$O(n \log n)$است!‎ حافظه داینامیک مورد نیاز هم از ‎$O(n^2)$‎ است و هر خانه آن از ‎$O(1)$‎ بروزرسانی می‌شود. پس پیچدگی کل الگوریتم (هم زمان هم حافظه) ‎$O(n^2)$‎ است‎!‎ * [[سوال ۶۲|سوال بعد]] * [[سوال ۶۰|سوال قبل]]