فرض کنید $f(x)$ برابر باشد با کوچکترین $k$ به طوری که $\lfloor\frac{x}{2^k}\rfloor = 0$. به شما $n$ عدد $a_1$ تا $a_n$ داده شده است. شما باید $n$ عدد صحیح بزرگتر از صفر $b_1$ تا $b_n$ را بیابید به طوری که :
در تنها سطر خروجی مقدار$\sum_{i=1}^{n}a_i \times f({b_i})$ را بنویسید.
ورودی نمونه | خروجی نمونه |
---|---|
1 3 1 1 1 2 1 3 | 15 |
پاسخ
میخواهیم اعداد $b_1$ تا $b_n$ را طوری بهدست بیاوریم که شرایط سوال را برقرار کند. فرض کنید $c_1$ تا $c_n$ به ترتیب رشتههای از صفر و یک باشند و $c_i$ برابر باشد با نمایش $b_i$ در مبنای دو که یک اول آن حذف شده است. در این صورت مسئله به سوال معروف زیر تبدیل می شود:
می خواهیم $n$ رشته $c_1$ تا $c_n$ را طوری پیدا کنیم که هیچ رشتهای رشته دیگر نباشد و مجموع ضرب $a_i$ در طول $c_i$ کمینه شود.
این مسئله با استفاده از الگوریتم huffman coding در زمان ${\cal O} (n log(n))$ قابل حل است و روش آن به صورت زیر است:
مقدار $x$ که از الگوریتم بالا بهدست میآید، همان جوابیست که باید در خروجی چاپ شود. مقدار $n$ زیاد است و انجام تمامی عملیات بالا در زمان مناسب امکانپذیر نیست. فرض کنید در یک مرحله از کار کمترین عدد multiset $a$ باشد و تعداد $a$های multiset برابر با $c$ باشد، در این صورت ما یک کار ثابت را $\frac{c}{2}$ بار انجام میدهیم، که با پیادهسازی درست میتوان هر کدام از این کارها را یک بار انجام داد. در این صورت پیچیدگی زمانی برنامهما برابر خواهد بود با ${\cal O}(m \times log(m))$ که در زمان مناسب پاسخ سوال را بهدست میآورد.