مجید، کودک دوستداشتنی و گوگولی قصه ما علاقه زیادی به جمع کردن ماژیک دارد.
مجید در خانه اش تا ماژیک دارد که هر کدام از آنها رنگی دارند که آن رنگ را با یک عدد نشان میدهیم. حال مسئلهای ذهن مجید را مشغول کرده است که از کدام رنگ کمترین تعداد ماژیک را دارد.
از آنجایی که مجید بسیار کوچک است و هنوز شمردن بلد نیست از شما میخواهیم که به مجید کمک کنید و رنگ ماژیکی که تعدادش کمتر از همه است را چاپ کنید. همچنین اگر بیش از یک رنگ داشتیم که تعداد ماژیکهایش کمتر مساوی از بقیه بود، بین آن رنگها، آن رنگی را چاپ کنید که عددش از بقیه کمتر است. (برای فهمیدن بهتر سوال، توضیح ورودیهای نمونه را بخوانید.)
در خط اول ورودی که تعداد ماژیک های مجید است میآید. در خط بعدی عدد با فاصله از هم میآید که عدد ام نشاندهنده رنگ ماژیک ام است. همچنین رنگ ماژیکها عددی بین ۱ تا ۱۰۰ است.
در تنها خط خروجی یک عدد چاپ کنید که برابر شمارهی رنگ ماژیکی است که تعدادش کمتر از بقیه است.
توضیح: مجید ۲ ماژیک با رنگ ۱ و یک ماژیک با رنگ ۲ دارد. پس کمترین رنگ، رنگ ۲ است.
توضیح: رنگ های ۲ و ۳ و ۴ کمترین مقدار را دارند اما چون عدد ۲ کوچکتر از ۳ و ۴ است، پس جواب برابر ۲ میشود.
میلاد و مجید در حال ساخت یک رشته طولانی از و هستند.
رشته به این ترتیب ساخته میشود که در گام اول میلاد را مینویسد. از آن پس هر کس در نوبت خود رشتهای که تا الان ساخته شده است را در نظر گرفته و با تبدیل همه ها به و همه ها به ، رشته حاصل را در ادامه رشته قبلی مینویسد و سپس نوبت نفر بعد میشود. و این کار را تا ابد ادامه میدهند.
برای مثال، پنج نوبت اول بازی به صورت زیر است:
ابتدا میلاد را مینویسد و رشته در پایان این مرحله میشود.
سپس مجید رشته فعلی که بوده را گرفته و آن را متمم میکند و به انتهای رشته اضافه میکند در پایان این مرحله رشته به صورت میشود.
سپس میلاد را گرفته و آن را متمم میکند و به انتهای رشته اضافه میکند و در پایان این مرحله رشته به صورت خواهد شد.
سپس مجید رشته را گرفته و با متمم کردن آن و اضافه کردنش به انتهای رشته، رشته به شکل میشود. و به همین ترتیب ساخت رشته تا ابد ادامه پیدا میکند.
حال ما از شما میخواهیم با گرفتن و ، از کاراکتر ام تا کاراکتر ام رشته را برای ما چاپ کنید.
در یک خط به ترتیب و به شما داده میشود.
از کاراکتر ام تا کاراکتر ام رشته را در یک خط و بدون فاصله چاپ کنید.
مجید که به تازگی برنامهنویسی یاد گرفته است، شبه کدی برای مرتب سازی صعودی یک آرایه به اسم به طول نوشته است که به وضوح غلط است. این تکه کد به صورت زیر است:
میلاد جایگشتی از اعداد ۱ تا دارد که بعضی از اعداد آن مشخص نیست و به جای آن صفر گذاشته شده است.
حال ما میخواهیم بدانیم آیا میتوانیم جای صفرهای جایگشت، اعدادی قرار بدهیم به طوری که در انتها:
(برای فهمیدن بهتر، بخش ورودی و توضیح نمونهها را بخوانید.)
در خط اول عدد که تعداد اعداد جایگشت است به شما داده میشود. در خط بعدی عدد،بین تا ، که با فاصله جدا شدهاند به شما داده میشود که اعداد جایگشت میلاد است.
اگر میتوانستیم صفرها را به گونهای عوض کنیم که شرایط صورت سوال را داشت در خط اول خروجی عبارت Yes
و در خط بعدی جایگشت کامل را به همراه اعدادی که به جای صفرها جایگزین شدهاند چاپ کنید.
(چنانچه چندین جایگشت وجود داشت، شما به دلخواه یکی از آنها را چاپ کنید.)
در غیر اینصورت در یک خط عبارت No
را چاپ کنید.
توضیح: تنها عددی که میتواند جای ۰ بگذارد عدد ۴ است که برنامه مجید میتواند این جایگشت را مرتب کند.
توضیح: اگر جایگشت فوق را به برنامه مجید بدهیم آن را به درستی مرتب نمیکند. توجه کنید که جایگشت فوق یکی از جواب های مسئله است؛ جایگشتهای دیگری نیز وجود دارد که برنامهی مجید روی آنها درست کار نمیکند.
چند صباحی است که مجید به دنبال کار در شرکتهای برنامهنویسی میگردد، اما شرکتهای برنامهنویسی به دلایل نامعلومی او را رد میکنند .
امروز مجید تصمیم گرفته که شانس خود را برای شرکت سحاب امتحان کند، بدین منظور مجید رزومه خود را برای شرکت سحاب میفرستد.
بعد از بررسی رزومه مجید، شرکت سحاب متوجه میشود که این مجید همان مجید مشهور است و در نتیجه میخواهند که او را برای کار در شرکت نپذیرند، اما از آنجا که مسئولین استخدام شرکت سحاب انسانهای مهربانی هستند، یک شانس به مجید میدهند و به اون میگویند در صورتی استخدام میشود که بتواند از یک مسیری به شرکت سحاب برسد و در این مسیر از هر شهری حداکثر یک بار عبور کند!
کشوری که مجید در آن زندگی میکند شامل شهر و جادهی دو طرفه است، که شهرها از ۰ تا شمارهگذاری شدهاند ولی جادههای این کشور به طرز عجیبی طراحی شدهاند.
جادهها بطور کاملاً تصادفی کشیده شدهاند! برای هرچه بیشتر تصادفی شدن این جادهکشی، از الگوریتم KISS (مخفف Keep It Simple Stupid) برای ساخت اعداد تصادفی و کشیدن جادهها استفاده شده است. کد این الگوریتم در زبان ++C به شکل زیر است. (مقادیر اولیهی متغیرهای و و و در ورودی به شما داده میشود.)
سپس مسئولین بین شهرها به صورت زیر جاده احداث کردهاند. (تابع build_road_between
بین دو شهر یک جاده دوطرفه قرار میدهد.)
دقت کنید که ممکن است بین ۲ شهر بیش از یک جاده احداث شود و یا ممکن است از یک شهر به خودش جادهای وجود داشته باشد.
با توجه به اینکه مجید به دلایل نامعلومی نمیتواند مسیر رسیدن به سحاب را پیدا کند، از شما کمک خواسته تا بلکه شما بتوانید به او برای رسیدن به این شرکت و این شغل کمک کنید.
(به محدودیت حافظه و ورودیهای این سوال دقت کنید، حافظه به گونهای محدود شده که نتوان اطلاعات کل جاده ها را نگه داشت.)
در خط اول ورودی و که به ترتیب تعداد شهر ها و تعداد جادهها است آمده.
در خط بعدی به ترتیب ۴ عدد و و و آمدهاست.
و در خط آخر ابتدا شماره شهری که مجید در آن است() و سپس شماره شهری که شرکت سحاب در آن واقع شده()، آمده است.
در خط اول خروجی تعداد جاده ها برای رسیدن از شهر مجید به شهر شرکت سحاب را چاپ کنید و در خط بعدی به ترتیب شماره شهرهایی که مجید در این مسیر از آنها میگذرد(همراه با شهر مبدا و مقصد) را چاپ کنید.(در صورتی که چندین مسیر مطلوب وجود داشت یکی از آنها را به دلخواه چاپ کنید.)
مسیری که چاپ میکنید نباید شامل هیچگونه دوری باشد، همچنین طول مسیری که به عنوان جواب چاپ میکنید باید کمتر از باشد.(تضمین میشود در صورت وجود جواب، مسیری وجود دارد که طول آن کمتر از باشد.)
در صورتی که مسیری برای رسیدن به شرکت سحاب وجود نداشت -1
را چاپ کنید.
توضیح نمونهی ۱:
با توجه به الگوریتم KISS جادهی اول بین شهرهای ۲و۳، جادهی دوم بین شهرهای ۰و۳، جادهی سوم بین شهرهای ۱و۳ و جادهی چهارم بین شهرهای ۱و۲ کشیده میشود.
در نتیجه شکل نهایی جاده ها به صورت زیر خواهد بود.
مجید که به تازگی فهمیده در برنامهنویسی استعدادی ندارد، تصمیم گرفته به شغل شریف مزرعه داری مشغول شود. به همین علّت یک مزرعه خریده است و میخواهد در آن به کشت و کار بپردازد.
محصولاتی که مجید قصد کاشت آنها را دارد، سه نوع هستند: درختی(مثل گردو)، بوتهای(مثل تمشک)، ریشهای(مثل هویج)
مزرعه از تعدادی زمین کشت تشکیل شده است که هر یک از آنها قابلیت کشت تعدادی از سه نوع گیاه گفته شده را دارند. مثلا ممکن است در یک زمین فقط گیاه بوتهای بتوان کاشت، یا در زمینی دیگر گیاهان بوتهای و ریشهای بتوان کاشت. ممکن است در یک زمین هیچ نوع گیاهی نیز نتوان کاشت.
ابتدا تمام زمینهای کشت عاری از هر گونه گیاه هستند. هر گیاه یک نرخ رشد(در واحد کیلوگرم) مثل دارد و هر گاه در یک زمینِ کشت، گیاهی کاشته شود، از همان روز به مدّت ۵ روز، روزانه کیلوگرم از محصولات آن گیاه، به انبار مزرعه اضافه خواهد شد.
علاوه بر موارد گفته شده، در فروشگاه محصولات کشاورزی چند نوع کود وجود دارد. هر کود یک ضریب افزایندگی و یک میزان ماندگاری دارد. اگر کودی با ضریب افزایندگی و میزان ماندگاری روز به یکی از زمینهای کشاورزی اضافه کنیم، از آن روز به مدّت روز، هر گیاهی که در آن زمین در حال ثمردهی باشد برابر ثمر خواهد داد. مثلا اگر گیاهی با نرخ رشد ۵ در آن زمین کاشته شده باشد و ما در سومین روزی که از کشت گیاه میگذرد به آن کودی با ضریب افزایندگی ۶ بدهیم، در آن روز و دو روز پس از آن گیاه ۳۰ کیلوگرم بار خواهد داد و باقی مانده عمرش را مثل قبل سپری خواهد کرد.
لازم به ذکر است که در صورتی که در یک زمین چند نوع کود وجود داشته باشند، ضریب افزایندگی در آن زمین به اندازهی مجموع ضریب افزایندگی آن کودها خواهد بود. مثلا اگر در روز اول کودی با ضریب افزایندگی ۴ و میزان ماندگاری ۴ روز به زمین اضافه کنیم، در روز دوم کودی با ضریب افزایندگی ۲ و میزان ماندگاری ۲ روز به زمین اضافه کنیم، در روز اول و چهارم گیاهان داخل زمین ۴ برابر و در روز دوم و سوم نیز ۶ برابر ثمر خواهند داد.
علاوه بر اینها! هر روز تعدادی مشتری به مجید مراجعه میکنند تا محصولات او را بخرند. هر گیاه نیز یک قیمت پایه بر حسب «سکه بر کیلوگرم» دارد. چنان چه در انبار مزرعهی مجید به اندازهی تقاضای آن مشتری از آن محصول موجود باشد، درخواست مشتری پاسخ داده خواهد شد و متناسب با میزان خرید آن مشتری و نوع محصول خریداری شده، پول به مجید خواهد رسید. در غیر این صورت درخواست مشتری رد خواهد شد.
مجید نزد هر مشتری مقداری آبرو دارد. هر بار که درخواست یک مشتری رد شود، آبروی مجید نزد آن مشتری یک واحد کم میشود، در غیر این صورت نیز یک واحد افزوده میشود. وقتی مشتریای که آبروی مجید نزد آن است، از مجید محصولی با قیمت پایه میخرد، قیمت آن گیاه برای آن مشتری سکه بر کیلوگرم خواهد بود. دقّت کنید قیمت تمام شدهی یک محصول از صفر نمیتواند کمتر باشد و آبرویی که مجید نزد هر مشتری دارد در ابتدا صفر است.
ما به ازای هر روز از دوران مزرعهداری مجید به شما تعدادی دستور و تعدادی پرسش میدهیم، شما باید به دستورها عمل کنید و جواب پرسشها را به ترتیب در خروجی چاپ کنید. جزییات بیشتر در این مورد را در قسمت «ورودی» و «خروجی» بخوانید.
در خط اول ورودی، تعداد زمینهای کشت را به شما میدهیم.
در خط ام از هر یک از خط بعد مشخصات زمین ام میآید. مشخصات هر زمین تنها شامل سه عدد است که هر کدام ۰ یا ۱ هستند. عدد اول در صورتی ۱ است که بتوان در آن زمین گیاه درختی کاشت. عدد دوم در صورتی ۱ است که بتوان در آن زمین گیاه بوتهای کاشت. عدد سوم نیز در صورتی ۱ است که بتوان در آن زمین گیاه ریشهای کاشت.
سپس تعداد گیاهان داده میشود.
در خط ام از هر یک از خط بعد مشخصات گیاه ام میآید. به ازای هر گیاه، ابتدا نام آن و سپس نوع آن داده میشود. نوع هر گیاه یک کلمه برابر یکی از سه کلمهی risheh
و derakht
و buteh
است. بعد از یک فاصله قیمت پایهی آن گیاه و بعد از یک فاصلهی دیگر نیز ضریب رشد آن گیاه داده میشود.
سپس تعداد کودها داده میشود.
در خط ام از هر یک از خط بعد، مشخصات کود ام میآید. ابتدا نوع آن کود(یک کلمه)، سپس ضریب افزایندگی و سپس میزان ماندگاری آن کود داده میشوند.
در خط بعد عدد داده میشود که برابر تعداد روزها است. در ادامه دسته از دستورها و پرسشها داده میشود. دستهی ام پرسشها و دستورهایی است که در روز ام مجید به شما میدهد.
در هر دسته، ابتدا عددی مثل تعداد دستورها داده میشود.
در هر یک خط بعدی، دستوراتی از انواع زیر داده میشود:
bekar zamin_id giyah_name
این دستور به این معنی است که در زمین شماره zamin_id
گیاهی به اسم giyah_name
بکارید. در صورتی که در این روز گیاهی در آن زمین باشد که عمرش هنوز تمام نشده باشد، این دستور را نادیده میگیریم.
kooddehi zamin_id kood_name
به این معنی است که به زمین zamin_id
یک واحد از کود kood_name
را اضافه کنیم.
koodgiri kood_name value
به این معنی است که value
واحد از کود نوع kood_name
به دست ما رسیده است. این مقدار را در انبار ذخیره میکنیم!
چنان چه هر یک از عملیات بالا با موفقیت انجام شد باید به ازای آن دستور عبارت done
را چاپ کنید. در غیر این صورت باید عبارت failed
را چاپ کنید.
پس از دریافت دستور، عدد آمدهاست و از شما پرسش صورت میگیرد. پرسشها در پایان روز انجام میگیرند، یعنی در هنگام پاسخ دادن به پرسشها، فرض میکنیم که روز به پایان رسیده است و تمام محصولات تولید شده از زمینهای کشت به انبار منتقل شدهاند.
moshtari giyah_name value
به این معنی است که مشتریای به اسم moshtari
درخواست داده است به او value
کیلوگرم از محصول giyah_name
بفروشیم. اگر قادر به انجام این کار بودیم، تعداد سکّهای که از مشتری دریافت میشود را چاپ کنید. در غیر این صورت -1
چاپ کنید.
در پایان هر روز باید لیست (حداکثر) ۵ مشتری که بیشترین خرید را از مزرعه داشتهاند به ترتیب چاپ کنید. در صورتی که دو مشتری به یک اندازه خرید از فروشگاه داشته باشند (بر حسب سکه) کسی که نامش از نظر الفبایی کوچکتر است، ارجحیت دارد.
توجه کنید که در صورتی که در درخواستهای مشتریان، دو مشتری با یک اسم ظاهر شوند، آن دو یک نفر هستند! یعنی به طور مثال دو مشتری مختلف با اسم ali
وجود ندارند. همچنین اگر اوّلین مشتری در روز ام به ما مراجعه کند، تا قبل از آن روز لیست پرسودترین ۵ مشتری را چاپ نمیکنیم!
لازم به ذکر است که در یک روز دستورات و پرسشها به ترتیب زمانی به ما داده میشوند.
در ضمن تمام اعداد ورودی حداکثر برابر ۱۰ هستند و تمام کلمات ورودی فقط از حروف کوچک الفبای انگلیسی تشکیل شدهاند.
به ازای هر پرسش در هر خط جواب آن پرسش را چاپ کنید.
پس از پرسشهای هر روز نیز در یک خط نام (حداکثر) ۵ پرسودترین مشتری را چاپ کنید. (به ترتیب از بیشترین خرید به کمترین خرید)
مجید که از کار در مزرعه خسته شده است، به هنر آشپزی روی آورده و میخواهد سبک جدیدی از آشپزی را ارائه بدهد. به این منظور او با استفاده از فرمولهای پیچیدهای که دارد تعدادی غذا درست میکند و هر غذا از تعدادی مادهی اولیه درست میشود. مواد اولیه را با اعداد صحیح بین ۰ تا نشان میدهیم و تعداد غذاهایی که مجید میپزد را با مشخص میکنیم.
مجید در آشپزی هم رفتارهای عجیبی دارد! مثلاً همهی غذاهایی که مجید میپزد تعداد مواد اولیهشان برابر است. تعداد مواد اولیهی غذاهای مجید را با مشخص میکنیم. همچنین هر غذایی یک دستور پخت دارد که مشخص میکند مواد اولیه به چه ترتیبی باید اضافه شوند؛ یعنی میتوان گفت به ازای غذای ام، مجید دنبالهای از مواد اولیه دارد که شماره مواد اولیهی آن و ترتیب اضافه شدن آنها را مشخص میکند. ()
عجیبترین رفتار مجید در آشپزی این است که تعداد غذاهایی که میپزد خیلی زیاد است! آنقدر زیاد است که در حافظه نمیگنجد و نمیتواند بطور مستقیم دستور پخت آن غذاها را به فرد دیگری توضیح دهد؛ برای همین دنبالهی مواد اولیهی غذاهای خود را کاملاً اتفاقی میسازد! برای این کار از الگوریتم KISS (مخفف Keep It Simple Stupid)استفاده میکند. کد این الگوریتم در زبان ++C به شکل زیر است. (مقادیر اولیهی متغیرهای و و و در ورودی به شما داده میشود.)
سپس مجید بصورت کد زیر، دستور پخت غذاها را تولید میکند. (مقدار نیز در ورودی مسئله آمده است.)
مجید پس از مدتی طولانی متوجه شد که با اینکه دستور پختهایش بصورت کاملاً اتفاقی و پخش هستند، ولی ممکن است تعدادی از این غذاها عیناً یکسان باشند؛ یعنی تمام مواد اولیه و ترتیب اضافه کردنشان داخل دستور پخت یکی باشد. (دقت کنید که تعداد مواد اولیه در دستور پخت غذاها هم برابر است.)
حال مجید از شما میخواهد برنامهای بنویسید که با ورودی گرفتن همهی اطلاعات، تعداد انواع غذاهای مختلفی را که تولید میکند بصورت تقریبی را خروجی دهد. برای چالشبرانگیزتر شدن مسئله مجید اطلاعات چند روز مختلفش را به برنامهی شما میدهد که چندین سناریوی مختلف تولید میکنند و شما باید به همهی آنها پاسخ بدید. (به بخش ورودی توجه کنید.)
البته نیازی نیست شما پاسخ دقیق را خروجی دهید؛ شما میتوانید با کمی خطا پاسخ مسئله را بیابید. هرچه خروجی شما دقیقتر باشد، در نهایت نمرهای که برنامهی شما از این سوال دریافت میکند بیشتر خواهد بود.
در خط اول ورودی آمده که نمایانگر تعداد روزهایی است که مجید آشپزی میکند.
به ازای هر روز، دو خط ورودی آمده.
در خط اول روز ام، ورودی ابتدا و سپس آمده است که تعداد غذاهای آن روز و تعداد مواد اولیه استفاده شده در هریک از آن غذاها را مشخص میکند.
سپس در خط بعدی ورودی هر روز، به ترتیب ۵ عدد و و و و برای آن روز آمده است که نمایانگر مقادیر اولیهی تابع تصادفی مورد استفادهی مجید برای آن روز هستند.
مجموع برای همهی روز حداکثر برابر است.
خروجی باید شامل خط باشد و در خط ام تقریبتان از تعداد غذاهای متمایزی که مجید در روز ام درست میکند را چاپ خواهید کرد.
*توضیح ورودی نمونه : * در این مثال مجید ۳ روز آشپزی خواهد کرد که اطلاعات هر روز در ۲ خط متوالی آمده است. در خط دوم و سوم ورودی اطلاعات روز اول آشپزی، در خط چهارم و پنجم ورودی اطلاعات روز دوم آشپزی و در ۲ خط آخر اطلاعات روز سوم آشپزی آمده است.