در این سوال به شما دو عدد صحیح مثل و داده میشود. از شما میخواهیم برنامهای بنویسید که مقدار و را دریافت کند و را چاپ کند.
در تنها سطر ورودی، دو عدد صحیح و که با یک فاصله از هم جدا شدهاند، داده میشود.
در تنها سطر خروجی، مقدار را چاپ کنید.
به احتمال زیاد، شما با سیستم داوری مسابقات برنامهنویسی آشنایی ندارید.
بنابراین ابتدا اینجا را بخوانید و اگر بازهم مشکل شما حل نشد به ما پیام دهید.
مسئله را به سه قسمت تقسیم کنید:
برای آشنایی بیشتر دربارهی نحوهی دریافت ورودی این لینک را مطالعه کنید.
از چاپ کردن موارد اضافه هنگام دریافت ورودی مثل please enter a number:
و چیزهای مشابه آن پرهیز کنید.
توجه کنید ورودی در یک خط داده میشود. بنابراین اگر از زبانهایی مثل پایتون برای برنامهنویسی استفاده میکنید، باید یکبار با کمک input
ورودی بگیرید و سپس رشته بدست آمده را دو قسمت کنید.
امین وارد یک آبمیوه فروشی میشود. معده امین لیتر ظرفیت آبمیوه دارد!
در این آبمیوه فروشی نوع آبمیوه وجود دارد. انواع آبمیوه را با اعداد تا شمارهگذاری میکنیم. از آبمیوهی نوع ام () به اندازهی لیتر در مخزن آن وجود دارد.
امین میداند که اگر همهی ظرف آبمیوهی موجود در مخزن ام را بنوشد، به اندازهی خوشحال میشود. همچنین اگر هر کسری از این ظرف را بخورد به همان نسبت خوشحالی بدست میآورد. (برای مثال اگر لیتر بنوشد بهاندازهی خوشحالی بدست میآورد.)
حال امین میخواهد از هر نوع آبمیوه مقداری بنوشد. (این مقدار میتواند هر عدد حقیقی نامنفی باشد!) به طوری که مجموع خوشحالی او بیشینه باشد.
از شما میخواهیم برنامهای بنویسید که این مقدار بیشینه را محاسبه و چاپ کند.
در سطر اول ورودی، عدد صحیح و مثبت و داده میشود.
در سطر بعدی، در هر سطر، دو عدد و که با یک فاصله از هم جدا شدهاند.
در تنها سطر خروجی، حداکثر مجموع خوشحالی که امین میتواند بدست بیاورد را چاپ کنید.
خروجی برنامه را با دقت دقیقاً یک رقم بعد از اعشار چاپ کنید.
ابتدا مسئله را برای حالت حل کنید.
اکنون که میتوانید تصمیم بگیرد بین دو آبمیوه کدامیک الویت دارد. سعی کنید با همین روش همهی آبمیوهها را مرتب کنید.
برای اینکه این مرتبسازی سریع باشد، سعی کنید از روشهای مرتبسازی مقایسهای مثل merge sort یا quick sort استفاده کنید تا بهاندازهی کافی راهحل شما سریع باشد.
به شما عدد صحیح و عدد اعشاری داده میشود. از شما میخواهیم برنامهای بنویسید تا حاصل عبارت زیر را محاسبه کند.
که در اینجا به معنای براکت است و مقدار آن بزرگترین عدد صحیح کمتر یا مساوی است.
در سطر اول تعداد سناریوها داده میشود.
در سطر اول هر سناریو، عدد صحیح و مثبت داده میشود.
در سطر دوم هر سناریو، عدد اعشاری داده میشود.
عدد اعشاری دقیقاً با دقت حداکثر ۷ رقم بعد از اعشار داده میشود.
در تنها سطر خروجی، یک عدد صحیح که برابر پاسخ مسئله است را چاپ کنید.
سناریو اول.
سناریو دوم.
سناریو سوم.
توجه کنید مقدار هر براکت یا است.
مقدار براکت داده شده، به ترتیب صعودی است. پس میتوانید با استفاده binary search آخرین براکتی که است را پیدا کنید.
با همان استدلال میتوان ثابت کرد پاسخ مسئله برابر است.
یک گراف ساده به نام با راس و یال داریم. راسهای این گراف با اعداد تا شمارهگذاری شدهاند. در هر عملیات میتوانیم یکی از دو عدد صحیح و مثبت مثل و را انتخاب کنیم به طوری که و یکی از دو عملیات زیر را انجام دهیم اگر یال در موجود است، آن را حذف کنیم. اگر یال در موجود نیست، آن را به اضافه کنیم.
میخواهیم با این عملیاتها را به یک درخت، تبدیل کنیم. به شما گراف داده میشود و از شما میخواهیم کمترین تعداد عملیات لازم برای تبدیل به یک درخت را محاسبه کنید.
در سطر اول ورودی، دو عدد صحیح و که با یک فاصله از هم جدا شدهاند، داده میشود.
در سطر بعدی، در هر سطر، دو عدد صحیح و که با یک فاصله از هم جدا شدهاند داده میشود. یک یال از است.
کمترین تعداد عملیات لازم برای تبدیل به یک درخت.
گراف درخت است اگر و تنها اگر همبند باشد و هیچ دوری نداشته باشد.
اگر دارای مولفهی همبندی باشد، به حداقل یال نیاز داریم که آن را همبند کنیم.
اگر یک مولفهی همبندی دارای راس و یال باشد، باید یک زیردرخت فراگیر آن که شامل یال است را نگهداریم و یال دیگر را از آن مولفههمبندی حذف کنیم. (با وجود این یالها دور گراف بهوجود میآید.)
اگر مجموع یالهای مورد نیاز برای حذف را محاسبه کنید، میبیند که فقط به مقدار نیاز دارید و میتوانید آن را با استفاده از الگوریتمهای مثل dfs، bfs یا dsu بدست آورید.
یک آرایه از اعداد صحیح مثل داریم. در مرحله یک عملیات مثل زیر روی آن انجام میدهیم.
دو عدد صحیح مثل و انتخاب میکنیم که باشد و سپس مقدار
میشود که منظور از جملهی ام دنباله فیبوناچی است. دنباله فیبوناچی به صورت زیر تعریف میشود:
از شما میخواهیم بعد از پایان این عملیاتها، مقدار نهایی اعضای آرایه را چاپ کنید. چون این مقدار میتواند خیلی بزرگ باشد. صرفاً باقیمانده هر عدد آرایه را بر چاپ کنید.
در سطر اول ورودی، دو عدد صحیح و مثبت و که با یک فاصله از هم جدا شدهاند، داده میشود.
در سطر دوم ورودی، عدد صحیح که با یک فاصله از هم جدا شدهاند داده میشود.
در سطر بعدی، در هر سطر دو عدد صحیح و داده میشود که نشاندهندهی بازهی عملیات است.
در تنها سطر خروجی، عدد صحیح که با یک فاصله از هم جدا شدهاند را چاپ کنید که وضعیت نهایی آرایهی را نشان میدهد.
چون ممکن است مقدار اعداد آرایه خیلی بزرگ شود، باقیماندهی این اعداد را بر چاپ کنید.
نیازی نیست همهی تغییرات را در لحظه روی آرایه اعمال کنیم. میتوانیم همه را دریافت کنیم و با ترتیبی مناسب آنها را روی آرایه اعمال کنیم.
اگر لحظهی شروع و پایان هر بازه که باید تغییر کند را روی آرایه در نظر بگیریم و به ترتیب از چپ آرایه (اندیس ۰) شروع کنیم و به سمت راست (اندیس ) حرکت کنیم و همهی تغییرات را به همین ترتیب روی آرایه اعمال کنیم. به این ایده sweep line میگویند.
با توجه به رابطه بازگشتی فیبوناچی که برای همه یکی هست میتوان اتفاق این تغییرات را جمع کرد. یعنی اگر چند تغییر روی یک خانه اتفاق میافتد میتوان همهی آنها را باهم جمع کرد.