آماده‌سازی مرحله‌ی سوم

مرحله‌ی سوم المپیاد کامپیوتر با مرحله‌ی اول و دوم تفاوت مهمی دارد. در این مرحله علاوه بر توانایی حل مسئله، آشنایی با برنامه‌نویسی و توانایی استفاده از کامپیوتر برای حل مسائل مورد ارزیابی قرار می‌گیرد.

این آزمون هر سال پیش از شروع دوره‌ی تابستان و به‌صورت حضوری برگزار می‌شود و پذیرفته‌شدگان مرحله‌ی دوم می‌توانند در آن شرکت کنند. هدف اصلی آزمون، ارزیابی توانایی دانش‌پژوهان در حل مسئله با استفاده از کامپیوتر و همچنین اطمینان از داشتن آشنایی اولیه با برنامه‌نویسی است.

در این صفحه با ساختار آزمون، نحوه‌ی آماده شدن برای آن و نکاتی که در زمان آزمون باید به آن‌ها توجه کنید آشنا خواهید شد.

ساختار آزمون

آزمون مرحله‌ی سوم حدود ۶ سؤال چندبخشی دارد و در دو روز برگزار می‌شود.

سؤال‌های آزمون معمولاً به گونه‌ای طراحی می‌شوند که بخش‌های مختلف آن‌ها به‌تدریج دشوارتر شوند. البته این ترتیب یک قاعده‌ی قطعی نیست و ممکن است در بعضی سؤال‌ها متفاوت باشد.

به‌طور معمول:

  • قسمت اول: به گونه‌ای است که می‌توانید با محاسبه روی کاغذ و بدون استفاده از کامپیوتر به جواب برسید. برای مثال ممکن است یک مسئله‌ی شمارشی یا ریاضی باشد.
  • قسمت دوم: معمولاً برای رسیدن به جواب نیاز به استفاده از کامپیوتر و برنامه‌نویسی ساده دارید. آشنایی با آرایه‌ها، حلقه‌ها، مرتب‌سازی و الگوریتم‌های ساده برای این قسمت کافی است.
  • قسمت سوم: نیازمند حل تئوری مفصل‌تر و برنامه‌نویسی بیشتری است، اما تلاش می‌شود برای حل آن به الگوریتم‌ها یا ابزارهای برنامه‌نویسی بسیار پیچیده نیاز نباشد.

بنابراین ممکن است یک سؤال را بتوانید ابتدا با کاغذ و قلم حل کنید، سپس برای ادامه‌ی آن یک برنامه‌ی ساده بنویسید و در نهایت با ترکیب ایده‌ی ریاضی و برنامه‌نویسی به قسمت‌های دشوارتر برسید.

یک تفاوت مهم با مسابقات برنامه‌نویسی

در آزمون مرحله‌ی سوم، شما برنامه‌ی خود را برای داور ارسال نمی‌کنید. فقط خروجی برنامه برای حکم (Judge) ارسال می‌شود یا در پاسخ‌نامه نوشته می‌شود.

این موضوع یکی از مهم‌ترین نکاتی است که باید قبل از آزمون آن را درک کنید.

در یک مسابقه‌ی معمول برنامه‌نویسی، برنامه‌ی شما باید برای همه‌ی ورودی‌های مجاز کار کند. اما در مرحله‌ی سوم ممکن است لازم باشد برای ورودی مشخص‌شده در صورت سؤال، خروجی درست را پیدا کنید.

بنابراین در این آزمون ممکن است یک برنامه‌ی ساده که فقط برای همان ورودی کار می‌کند، کاملاً کافی باشد.

البته این به معنی بی‌اهمیت بودن برنامه‌نویسی نیست. شما باید بتوانید مسئله را به شکلی مناسب مدل کنید، برنامه‌ی موردنیاز را بنویسید، آن را اجرا کنید و از خروجی صحیح مطمئن شوید.

برای مرحله‌ی سوم چه چیزهایی باید بلد باشیم؟

سرفصل‌های نظری مرحله‌ی سوم به‌طور کلی همان مباحث مرحله‌ی دوم است و در کنار آن‌ها آشنایی ابتدایی با برنامه‌نویسی موردنیاز است.

بنابراین اگر برای مرحله‌ی دوم آماده شده‌اید، لازم نیست برای مرحله‌ی سوم از ابتدا یک مجموعه‌ی کاملاً جدید از مباحث نظری را شروع کنید.

در بخش برنامه‌نویسی باید حداقل با موارد زیر راحت باشید:

  • متغیرها و انواع داده‌ی اصلی
  • شرط‌ها
  • حلقه‌ها
  • آرایه‌ها
  • رشته‌ها
  • توابع
  • مرتب‌سازی
  • کار با اعداد و محاسبات
  • خواندن ورودی و تولید خروجی
  • استفاده از برنامه برای انجام محاسبات تکراری

هدف این نیست که قبل از آزمون تعداد زیادی الگوریتم پیشرفته یاد بگیرید. مهم‌تر این است که بتوانید یک ایده‌ی ساده را سریع و بدون دردسر به برنامه تبدیل کنید.

مهم‌ترین مهارت: تبدیل ایده به برنامه

ممکن است در مرحله‌ی دوم یک مسئله را روی کاغذ حل کنید و به جواب برسید؛ اما در مرحله‌ی سوم لازم است بتوانید همان ایده را به برنامه تبدیل کنید.

برای مثال اگر به این نتیجه رسیده‌اید که باید مجموع یک عبارت را برای $10^6$ حالت محاسبه کنید، دیگر نباید محاسبات را روی کاغذ انجام دهید. باید بتوانید در چند دقیقه برنامه‌ای بنویسید که این کار را برای شما انجام دهد.

بنابراین هنگام تمرین سعی کنید بعد از حل یک مسئله از خودتان بپرسید:

  • آیا می‌توانم این محاسبات را به کامپیوتر بسپارم؟
  • اگر بله، ساده‌ترین برنامه‌ای که این کار را انجام می‌دهد چیست؟
  • آیا می‌توانم این برنامه را سریع و بدون خطا بنویسم؟
  • آیا خروجی برنامه را بررسی کرده‌ام؟

تمرین برای مرحله‌ی سوم

مهم‌ترین منبع تمرین، سؤال‌های مرحله‌ی سوم سال‌های گذشته است. با مراجعه به آرشیو سؤال‌های مرحله‌ی سوم می‌توانید سؤال‌های دوره‌های گذشته را مشاهده کنید.

پیشنهاد می‌شود ابتدا سؤال‌ها را بدون نگاه کردن به راه‌حل بررسی کنید و تلاش کنید بفهمید هر بخش از سؤال از شما چه می‌خواهد.

در تمرین مرحله‌ی سوم، فقط به این فکر نکنید که «آیا می‌توانم سؤال را حل کنم؟». سعی کنید تمرین کنید که:

  • ایده‌ی ریاضی را پیدا کنید.
  • محاسبات طولانی را به کامپیوتر بسپارید.
  • یک برنامه‌ی ساده و سریع بنویسید.
  • برنامه را اجرا کنید.
  • خروجی را بررسی کنید.
  • اگر جواب غیرمنتظره بود، بتوانید علت آن را پیدا کنید.

از سؤال‌های ساده غافل نشوید

یکی از اشتباهات رایج این است که دانش‌پژوه تصور کند برای موفقیت در مرحله‌ی سوم باید الگوریتم‌های بسیار پیشرفته بلد باشد.

این تصور درست نیست.

بخش‌هایی از سؤال‌ها عمداً به گونه‌ای طراحی می‌شوند که با برنامه‌نویسی ساده قابل حل باشند. بنابراین اگر برنامه‌نویسی شما هنوز خیلی قوی نیست، ابتدا تلاش کنید همین بخش‌ها را به‌خوبی یاد بگیرید.

توانایی نوشتن سریع یک برنامه‌ی ساده، در این آزمون بسیار ارزشمندتر از دانستن یک الگوریتم پیچیده است که نمی‌توانید آن را به‌درستی پیاده‌سازی کنید.

مدیریت زمان

از آنجا که سؤال‌ها چندبخشی هستند، ممکن است در یک سؤال بخش اول را به‌راحتی حل کنید اما در بخش‌های بعدی با مشکل مواجه شوید.

در این شرایط نباید تمام زمان خود را صرف یک سؤال کنید.

اگر یک بخش برای شما دشوار است، آن را موقتاً کنار بگذارید و سؤال‌های دیگر را بررسی کنید. ممکن است بتوانید از سؤال دیگری نمره‌ای بگیرید که بسیار راحت‌تر است.

همچنین توجه کنید که قسمت‌های ابتدایی سؤال‌ها معمولاً فرصت خوبی برای جمع کردن نمره هستند. بنابراین سعی کنید سؤال‌های ساده و بخش‌هایی را که می‌توانید با اطمینان حل کنید از دست ندهید.

برنامه‌نویسی را در خانه تمرین کنید

برای موفقیت در مرحله‌ی سوم لازم نیست برنامه‌نویس حرفه‌ای باشید، اما باید آن‌قدر برنامه‌نویسی کرده باشید که نوشتن یک برنامه‌ی ساده برایتان تبدیل به یک کار عادی شود.

اگر برای نوشتن هر حلقه یا آرایه چند دقیقه وقت صرف می‌کنید، در آزمون زمان زیادی را از دست خواهید داد.

بنابراین قبل از آزمون تمرین کنید که بدون فکر کردن زیاد بتوانید:

  • یک آرایه تعریف کنید.
  • ورودی بخوانید.
  • روی اعضای آرایه حلقه بزنید.
  • یک آرایه را مرتب کنید.
  • یک تابع ساده بنویسید.
  • محاسبات را در یک حلقه انجام دهید.
  • خروجی را چاپ کنید.

زبان برنامه‌نویسی

برای آزمون باید با سی‌پلاس‌پلاس آشنایی داشته باشید.

لازم نیست با تمام امکانات زبان C آشنا باشید. در عوض، بهتر است بخش کوچکی از زبان را به‌خوبی بلد باشید و بتوانید بدون خطا از آن استفاده کنید.

برای مثال اگر با `vector`، `sort`، آرایه‌ها، رشته‌ها، حلقه‌ها، شرط‌ها و توابع به‌خوبی کار می‌کنید، برای بخش بزرگی از نیازهای آزمون کافی است.

هدف شما باید این باشد که در زمان آزمون، به جای درگیر شدن با زبان برنامه‌نویسی، ذهن خود را روی حل مسئله متمرکز کنید.

محیط آزمون

در کامپیوترهای آزمون نرم‌افزارهایی مانند Orwell Dev-C، Emacs، Code::Blocks، VS Code، Gvim و NotePad و همچنین کامپایلر gcc در اختیار شما قرار خواهد داشت. سیستم‌عامل ویندوز است و امکان استفاده از Judge نیز وجود دارد. همچنین یک ماشین‌حساب با قابلیت انجام عملیات اصلی در اختیار شما قرار می‌گیرد.

لازم نیست همه‌ی این محیط‌ها را بلد باشید. بهتر است قبل از آزمون فقط یکی از محیط‌هایی را که با آن راحت‌تر هستید انتخاب کنید و با همان تمرین کنید.

حتماً در آزمون آزمایشی شرکت کنید

اگر پیش از آزمون اصلی، آزمون آزمایشی برگزار شد، آن را جدی بگیرید.

هدف آزمون آزمایشی فقط حل سؤال نیست. باید در آن بررسی کنید که:

  • آیا محیط برنامه‌نویسی را به‌خوبی می‌شناسید؟
  • آیا می‌توانید برنامه را کامپایل و اجرا کنید؟
  • آیا می‌توانید از Judge استفاده کنید؟
  • آیا می‌توانید خروجی را به‌درستی ارسال کنید؟
  • آیا می‌توانید فایل‌های خود را ذخیره کنید؟
  • آیا سرعت تایپ و برنامه‌نویسی شما مناسب است؟

اگر در سیستم سخت‌افزاری یا نرم‌افزاری مشکلی مشاهده کردید، همان زمان آن را به مسئولین برگزاری اطلاع دهید.

ذخیره کردن برنامه‌ها

در طول آزمون مرتب برنامه‌ی خود را ذخیره کنید.

اگر کامپیوتر ریست شود یا برق قطع شود، ممکن است بخشی از کار شما از بین برود. بنابراین عادت کنید بعد از هر تغییر مهم برنامه را ذخیره کنید.

همچنین در پایان آزمون، ارسال پاسخ را به لحظه‌ی آخر موکول نکنید. طبق قوانین آزمون، ملاک نمره‌دهی جوابی است که به سامانه‌ی داوری ارسال شده است و اعتراض به عدم ثبت ارسال در ثانیه‌ی آخر پذیرفته نمی‌شود.

مراقب خروجی باشید

در مرحله‌ی سوم، درست بودن برنامه به‌تنهایی کافی نیست؛ چیزی که اهمیت دارد خروجی صحیح است.

بعد از اجرای برنامه، خروجی را با دقت بررسی کنید. اگر برنامه‌ای برای محاسبه‌ی یک عدد نوشته‌اید، سعی کنید در صورت امکان جواب را با یک روش مستقل یا برای نمونه‌های کوچک بررسی کنید.

گاهی اوقات یک برنامه کاملاً درست اجرا می‌شود، اما ایده‌ی استفاده‌شده اشتباه است. بنابراین «برنامه اجرا شد» به معنی «جواب درست است» نیست.

اگر برنامه‌نویسی بلد نیستم چه کنم؟

اگر در برنامه‌نویسی ضعیف هستید، نگران نباشید؛ اما آن را به روزهای آخر موکول نکنید.

برای شروع لازم نیست سراغ الگوریتم‌های پیچیده بروید. ابتدا بتوانید چند برنامه‌ی ساده بنویسید که شامل شرط، حلقه، آرایه و مرتب‌سازی باشند.

بعد از آن، سؤال‌های مرحله‌ی سوم سال‌های گذشته را بردارید و تلاش کنید قسمت‌هایی را که نیاز به برنامه‌نویسی ساده دارند، خودتان پیاده‌سازی کنید.

هدف این است که در روز آزمون، نوشتن یک برنامه‌ی ساده برای شما تبدیل به یک کار عادی شده باشد.

اشتباهات رایج

  • تلاش برای یادگیری تعداد زیادی الگوریتم پیشرفته به جای مسلط شدن به برنامه‌نویسی پایه
  • نادیده گرفتن قسمت‌های ساده‌ی سؤال
  • صرف زمان بسیار زیاد روی یک قسمت
  • نوشتن برنامه بدون اینکه قبل از آن دقیقاً بدانید چه چیزی را می‌خواهید محاسبه کنید
  • بررسی نکردن خروجی برنامه
  • ذخیره نکردن مرتب برنامه
  • موکول کردن ارسال جواب به ثانیه‌های پایانی
  • ناآشنایی با محیط برنامه‌نویسی
  • تصور اینکه «اگر برنامه‌ام درست باشد حتماً نمره می‌گیرم»؛ در این آزمون خروجی نهایی ملاک است.

ارتباط مرحله‌ی دوم و سوم

مرحله‌ی سوم ادامه‌ی منطقی مرحله‌ی دوم است، نه یک آزمون کاملاً جدا از آن.

برای حل بسیاری از سؤال‌های مرحله‌ی سوم همچنان به همان دانش ترکیبیات، نظریه‌ی اعداد، گراف، استدلال و حل مسئله‌ای نیاز دارید که در مرحله‌ی دوم یاد گرفته‌اید. تفاوت اصلی این است که در مرحله‌ی سوم باید بتوانید بخشی از این محاسبات و استدلال‌ها را با کمک کامپیوتر انجام دهید.

بنابراین اگر برای مرحله‌ی دوم آماده شده‌اید، بهترین کار این نیست که تمام وقت خود را صرف یادگیری برنامه‌نویسی کنید؛ بلکه باید در کنار ادامه‌ی تمرین‌های مرحله‌ی دوم، مهارت برنامه‌نویسی پایه‌ی خود را نیز تقویت کنید.

توصیه‌های پایانی

  • مرحله‌ی سوم جای یادگیری الگوریتم‌های خیلی پیچیده نیست؛ روی برنامه‌نویسی پایه و حل مسئله تمرکز کنید.
  • سعی کنید برنامه‌نویسی برای شما به یک ابزار تبدیل شود، نه هدف اصلی.
  • در تمرین‌ها ابتدا مسئله را روی کاغذ حل کنید و سپس ببینید چگونه می‌توان محاسبات را به کامپیوتر سپرد.
  • سؤال‌های سال‌های گذشته را حتماً در شرایط شبیه آزمون واقعی حل کنید.
  • به قسمت‌های ساده‌ی سؤال‌ها اهمیت زیادی بدهید؛ همین قسمت‌ها می‌توانند بخش مهمی از نمره‌ی شما را تشکیل دهند.
  • برنامه‌هایتان را مرتب ذخیره کنید و ارسال پاسخ را به لحظات پایانی موکول نکنید.
  • در زمان آزمون آرامش خود را حفظ کنید. اگر یک سؤال سخت بود، به این معنی نیست که همه‌ی سؤال‌ها سخت هستند.
  • هدف شما نباید این باشد که حتماً همه‌ی سؤال‌ها را حل کنید؛ هدف این است که از زمان خود بیشترین نمره‌ی ممکن را به دست آورید.