فرض کنید f(x) برابر باشد با کوچکترین k به طوری که ⌊x2k⌋=0. به شما n عدد a1 تا an داده شده است. شما باید n عدد صحیح بزرگتر از صفر b1 تا bn را بیابید به طوری که :
در تنها سطر خروجی مقدار\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)) که در زمان مناسب پاسخ سوال را بهدست میآورد.