مرحلهی سوم المپیاد کامپیوتر با مرحلهی اول و دوم تفاوت مهمی دارد. در این مرحله علاوه بر توانایی حل مسئله، آشنایی با برنامهنویسی و توانایی استفاده از کامپیوتر برای حل مسائل مورد ارزیابی قرار میگیرد.
این آزمون هر سال پیش از شروع دورهی تابستان و بهصورت حضوری برگزار میشود و پذیرفتهشدگان مرحلهی دوم میتوانند در آن شرکت کنند. هدف اصلی آزمون، ارزیابی توانایی دانشپژوهان در حل مسئله با استفاده از کامپیوتر و همچنین اطمینان از داشتن آشنایی اولیه با برنامهنویسی است.
در این صفحه با ساختار آزمون، نحوهی آماده شدن برای آن و نکاتی که در زمان آزمون باید به آنها توجه کنید آشنا خواهید شد.
آزمون مرحلهی سوم حدود ۶ سؤال چندبخشی دارد و در دو روز برگزار میشود.
سؤالهای آزمون معمولاً به گونهای طراحی میشوند که بخشهای مختلف آنها بهتدریج دشوارتر شوند. البته این ترتیب یک قاعدهی قطعی نیست و ممکن است در بعضی سؤالها متفاوت باشد.
بهطور معمول:
بنابراین ممکن است یک سؤال را بتوانید ابتدا با کاغذ و قلم حل کنید، سپس برای ادامهی آن یک برنامهی ساده بنویسید و در نهایت با ترکیب ایدهی ریاضی و برنامهنویسی به قسمتهای دشوارتر برسید.
در آزمون مرحلهی سوم، شما برنامهی خود را برای داور ارسال نمیکنید. فقط خروجی برنامه برای حکم (Judge) ارسال میشود یا در پاسخنامه نوشته میشود.
این موضوع یکی از مهمترین نکاتی است که باید قبل از آزمون آن را درک کنید.
در یک مسابقهی معمول برنامهنویسی، برنامهی شما باید برای همهی ورودیهای مجاز کار کند. اما در مرحلهی سوم ممکن است لازم باشد برای ورودی مشخصشده در صورت سؤال، خروجی درست را پیدا کنید.
بنابراین در این آزمون ممکن است یک برنامهی ساده که فقط برای همان ورودی کار میکند، کاملاً کافی باشد.
البته این به معنی بیاهمیت بودن برنامهنویسی نیست. شما باید بتوانید مسئله را به شکلی مناسب مدل کنید، برنامهی موردنیاز را بنویسید، آن را اجرا کنید و از خروجی صحیح مطمئن شوید.
سرفصلهای نظری مرحلهی سوم بهطور کلی همان مباحث مرحلهی دوم است و در کنار آنها آشنایی ابتدایی با برنامهنویسی موردنیاز است.
بنابراین اگر برای مرحلهی دوم آماده شدهاید، لازم نیست برای مرحلهی سوم از ابتدا یک مجموعهی کاملاً جدید از مباحث نظری را شروع کنید.
در بخش برنامهنویسی باید حداقل با موارد زیر راحت باشید:
هدف این نیست که قبل از آزمون تعداد زیادی الگوریتم پیشرفته یاد بگیرید. مهمتر این است که بتوانید یک ایدهی ساده را سریع و بدون دردسر به برنامه تبدیل کنید.
ممکن است در مرحلهی دوم یک مسئله را روی کاغذ حل کنید و به جواب برسید؛ اما در مرحلهی سوم لازم است بتوانید همان ایده را به برنامه تبدیل کنید.
برای مثال اگر به این نتیجه رسیدهاید که باید مجموع یک عبارت را برای $10^6$ حالت محاسبه کنید، دیگر نباید محاسبات را روی کاغذ انجام دهید. باید بتوانید در چند دقیقه برنامهای بنویسید که این کار را برای شما انجام دهد.
بنابراین هنگام تمرین سعی کنید بعد از حل یک مسئله از خودتان بپرسید:
مهمترین منبع تمرین، سؤالهای مرحلهی سوم سالهای گذشته است. با مراجعه به آرشیو سؤالهای مرحلهی سوم میتوانید سؤالهای دورههای گذشته را مشاهده کنید.
پیشنهاد میشود ابتدا سؤالها را بدون نگاه کردن به راهحل بررسی کنید و تلاش کنید بفهمید هر بخش از سؤال از شما چه میخواهد.
در تمرین مرحلهی سوم، فقط به این فکر نکنید که «آیا میتوانم سؤال را حل کنم؟». سعی کنید تمرین کنید که:
یکی از اشتباهات رایج این است که دانشپژوه تصور کند برای موفقیت در مرحلهی سوم باید الگوریتمهای بسیار پیشرفته بلد باشد.
این تصور درست نیست.
بخشهایی از سؤالها عمداً به گونهای طراحی میشوند که با برنامهنویسی ساده قابل حل باشند. بنابراین اگر برنامهنویسی شما هنوز خیلی قوی نیست، ابتدا تلاش کنید همین بخشها را بهخوبی یاد بگیرید.
توانایی نوشتن سریع یک برنامهی ساده، در این آزمون بسیار ارزشمندتر از دانستن یک الگوریتم پیچیده است که نمیتوانید آن را بهدرستی پیادهسازی کنید.
از آنجا که سؤالها چندبخشی هستند، ممکن است در یک سؤال بخش اول را بهراحتی حل کنید اما در بخشهای بعدی با مشکل مواجه شوید.
در این شرایط نباید تمام زمان خود را صرف یک سؤال کنید.
اگر یک بخش برای شما دشوار است، آن را موقتاً کنار بگذارید و سؤالهای دیگر را بررسی کنید. ممکن است بتوانید از سؤال دیگری نمرهای بگیرید که بسیار راحتتر است.
همچنین توجه کنید که قسمتهای ابتدایی سؤالها معمولاً فرصت خوبی برای جمع کردن نمره هستند. بنابراین سعی کنید سؤالهای ساده و بخشهایی را که میتوانید با اطمینان حل کنید از دست ندهید.
برای موفقیت در مرحلهی سوم لازم نیست برنامهنویس حرفهای باشید، اما باید آنقدر برنامهنویسی کرده باشید که نوشتن یک برنامهی ساده برایتان تبدیل به یک کار عادی شود.
اگر برای نوشتن هر حلقه یا آرایه چند دقیقه وقت صرف میکنید، در آزمون زمان زیادی را از دست خواهید داد.
بنابراین قبل از آزمون تمرین کنید که بدون فکر کردن زیاد بتوانید:
برای آزمون باید با سیپلاسپلاس آشنایی داشته باشید.
لازم نیست با تمام امکانات زبان C آشنا باشید. در عوض، بهتر است بخش کوچکی از زبان را بهخوبی بلد باشید و بتوانید بدون خطا از آن استفاده کنید.
برای مثال اگر با `vector`، `sort`، آرایهها، رشتهها، حلقهها، شرطها و توابع بهخوبی کار میکنید، برای بخش بزرگی از نیازهای آزمون کافی است.
هدف شما باید این باشد که در زمان آزمون، به جای درگیر شدن با زبان برنامهنویسی، ذهن خود را روی حل مسئله متمرکز کنید.
در کامپیوترهای آزمون نرمافزارهایی مانند Orwell Dev-C، Emacs، Code::Blocks، VS Code، Gvim و NotePad و همچنین کامپایلر gcc در اختیار شما قرار خواهد داشت. سیستمعامل ویندوز است و امکان استفاده از Judge نیز وجود دارد. همچنین یک ماشینحساب با قابلیت انجام عملیات اصلی در اختیار شما قرار میگیرد.
لازم نیست همهی این محیطها را بلد باشید. بهتر است قبل از آزمون فقط یکی از محیطهایی را که با آن راحتتر هستید انتخاب کنید و با همان تمرین کنید.
اگر پیش از آزمون اصلی، آزمون آزمایشی برگزار شد، آن را جدی بگیرید.
هدف آزمون آزمایشی فقط حل سؤال نیست. باید در آن بررسی کنید که:
اگر در سیستم سختافزاری یا نرمافزاری مشکلی مشاهده کردید، همان زمان آن را به مسئولین برگزاری اطلاع دهید.
در طول آزمون مرتب برنامهی خود را ذخیره کنید.
اگر کامپیوتر ریست شود یا برق قطع شود، ممکن است بخشی از کار شما از بین برود. بنابراین عادت کنید بعد از هر تغییر مهم برنامه را ذخیره کنید.
همچنین در پایان آزمون، ارسال پاسخ را به لحظهی آخر موکول نکنید. طبق قوانین آزمون، ملاک نمرهدهی جوابی است که به سامانهی داوری ارسال شده است و اعتراض به عدم ثبت ارسال در ثانیهی آخر پذیرفته نمیشود.
در مرحلهی سوم، درست بودن برنامه بهتنهایی کافی نیست؛ چیزی که اهمیت دارد خروجی صحیح است.
بعد از اجرای برنامه، خروجی را با دقت بررسی کنید. اگر برنامهای برای محاسبهی یک عدد نوشتهاید، سعی کنید در صورت امکان جواب را با یک روش مستقل یا برای نمونههای کوچک بررسی کنید.
گاهی اوقات یک برنامه کاملاً درست اجرا میشود، اما ایدهی استفادهشده اشتباه است. بنابراین «برنامه اجرا شد» به معنی «جواب درست است» نیست.
اگر در برنامهنویسی ضعیف هستید، نگران نباشید؛ اما آن را به روزهای آخر موکول نکنید.
برای شروع لازم نیست سراغ الگوریتمهای پیچیده بروید. ابتدا بتوانید چند برنامهی ساده بنویسید که شامل شرط، حلقه، آرایه و مرتبسازی باشند.
بعد از آن، سؤالهای مرحلهی سوم سالهای گذشته را بردارید و تلاش کنید قسمتهایی را که نیاز به برنامهنویسی ساده دارند، خودتان پیادهسازی کنید.
هدف این است که در روز آزمون، نوشتن یک برنامهی ساده برای شما تبدیل به یک کار عادی شده باشد.
مرحلهی سوم ادامهی منطقی مرحلهی دوم است، نه یک آزمون کاملاً جدا از آن.
برای حل بسیاری از سؤالهای مرحلهی سوم همچنان به همان دانش ترکیبیات، نظریهی اعداد، گراف، استدلال و حل مسئلهای نیاز دارید که در مرحلهی دوم یاد گرفتهاید. تفاوت اصلی این است که در مرحلهی سوم باید بتوانید بخشی از این محاسبات و استدلالها را با کمک کامپیوتر انجام دهید.
بنابراین اگر برای مرحلهی دوم آماده شدهاید، بهترین کار این نیست که تمام وقت خود را صرف یادگیری برنامهنویسی کنید؛ بلکه باید در کنار ادامهی تمرینهای مرحلهی دوم، مهارت برنامهنویسی پایهی خود را نیز تقویت کنید.