آمادهسازی دورهی طلا
دورهی طلا با دورهی تابستان تفاوت اساسی دارد. در دورهی تابستان بخش مهمی از زمان شما صرف یادگیری مباحث جدید و ساختن پایههای علمی میشود؛ اما در دورهی طلا انتظار میرود که بخش عمدهای از این پایهها را ساخته باشید و بتوانید دانش خود را در حل مسائل دشوار و در شرایط مسابقه به کار بگیرید.
در این دوره تنها ۸ نفر از بهترینهای المپیاد کامپیوتر کشور حضور دارند و در نهایت حداکثر ۴ نفر از میان آنها برای شرکت در المپیاد جهانی انتخاب خواهند شد. بنابراین رقابت جدی است و فاصلهی بین افراد نیز معمولاً بسیار کمتر از چیزی است که در مراحل قبل دیدهاید. در چنین شرایطی، صرفاً یادگرفتن مطالب جدید کافی نیست؛ باید بتوانید آنچه را میدانید، سریع، دقیق و کمخطا در یک مسابقهی واقعی به کار بگیرید.
هدف این صفحه آن است که به شما کمک کند از دورهی طلا بیشترین استفاده را ببرید و برای امتحانهای انتخاب تیم و در نهایت المپیاد جهانی آماده شوید.
دورهی طلا چه تفاوتی با دورهی تابستان دارد؟
در دورهی تابستان ممکن است هنوز در حال آشنا شدن با بسیاری از مفاهیم و الگوریتمها باشید. طبیعی است که بعضی از مطالب را برای اولین بار ببینید و برای یادگیری آنها زمان زیادی صرف کنید.
اما در دورهی طلا دیگر نباید انتظار داشته باشید که همهچیز در کلاس به شما آموزش داده شود. کلاسها برای تکمیل سیلابس، رفع نقاط ضعف، یادگیری مطالب پیشرفتهتر و عمیقتر کردن دانستههای قبلی برگزار میشوند؛ بخش مهمی از یادگیری شما باید خارج از کلاس و از طریق حل مسئله، شرکت در آزمون و بررسی راهحلها اتفاق بیفتد.
به عبارت دیگر، در دورهی طلا باید از «درس خواندن برای یادگیری» به سمت «تمرین کردن برای مسابقه دادن» حرکت کنید.
در این مرحله تفاوتهای کوچک اهمیت زیادی پیدا میکنند. ممکن است دو دانشپژوه هر دو یک الگوریتم را بدانند، اما یکی از آنها بتواند در ۲۰ دقیقه ایدهی مناسب را پیدا کند و بدون باگ پیادهسازی کند و دیگری به یک ساعت زمان نیاز داشته باشد. در سطح دورهی طلا، همین تفاوتهای ظاهراً کوچک میتوانند نتیجهی یک آزمون را تغییر دهند.
برنامهی غیرحضوری
در سه هفتهی ابتدایی هر ماه، مجموعهای از مسائل برای تمرین در اختیار شما قرار میگیرد. این مسائل از منابع مختلف و در سطح مسابقات معتبر المپیادهای کامپیوتر انتخاب میشوند.
این تمرینها را نباید صرفاً مجموعهای از سوالهایی بدانید که باید از روی آنها عبور کنید. هدف اصلی این است که با حل آنها دامنهی ایدهها و تجربهی شما بیشتر شود و نقاط ضعف خود را پیدا کنید.
برای استفادهی بهتر از تمرینها:
- سعی کنید قبل از دیدن راهحل، زمان کافی برای فکر کردن روی مسئله بگذارید.
- اگر مسئلهای را حل کردید، صرفاً به قبولی برنامه اکتفا نکنید. به این فکر کنید که آیا راهحل شما بهینه است و آیا میتوان آن را سادهتر و کمخطاتر نوشت.
- اگر مسئله را حل نکردید، بلافاصله به راهحل مراجعه نکنید. مدتی روی ایدههای مختلف فکر کنید و سعی کنید دقیقاً بفهمید در کجای مسیر گیر کردهاید.
- بعد از دیدن راهحل، آن را صرفاً نخوانید. سعی کنید راهحل را خودتان از ابتدا بازسازی کنید و سپس آن را پیادهسازی کنید.
- مسائلی را که در آنها نکتهی جدیدی یاد گرفتهاید ثبت کنید. بعد از مدتی یک مجموعهی شخصی از ایدهها، تکنیکها و اشتباهات متداول خود خواهید داشت.
- اگر در یک موضوع خاص چند بار دچار مشکل شدید، آن را به عنوان یک ضعف شخصی ثبت کنید و برای برطرف کردن آن برنامه داشته باشید.
در این مرحله کیفیت تمرین کردن از تعداد مسائل حلشده مهمتر است. ممکن است حل دقیق و عمیق یک مسئلهی دشوار، بیشتر از حل سریع چند مسئلهی ساده برای شما مفید باشد.
حل مسئله و استفاده از راهحلها
یکی از مهمترین مهارتهایی که در دورهی طلا باید به آن برسید، توانایی یادگیری از مسائلی است که نتوانستهاید حل کنید.
وقتی راهحل یک مسئله را میخوانید، از خودتان بپرسید:
- ایدهی اصلی راهحل چه بود؟
- چه چیزی باعث شد خودم این ایده را پیدا نکنم؟
- آیا تکنیک استفادهشده را قبلاً میشناختم؟
- آیا میتوانستم از اطلاعات صورت مسئله زودتر به این ایده برسم؟
- آیا این ایده را میتوان در مسائل دیگری هم استفاده کرد؟
- آیا در پیادهسازی راهحل نکتهای وجود داشت که قبلاً به آن توجه نمیکردم؟
بعد از خواندن راهحل، بهتر است صورت مسئله را ببندید و سعی کنید راهحل را بدون نگاه کردن دوباره بنویسید.
هدف از خواندن راهحل این نیست که تعداد بیشتری مسئله را «دیده باشید». هدف این است که مسئلهای که نتوانستید حل کنید، در آینده احتمال حل شدنش توسط شما را افزایش دهد.
آزمونهای دوره
آزمونهای دورهی طلا مهمترین فرصت شما برای تبدیل دانش به مهارت مسابقهای هستند.
در آزمونهای تمرینی، هدف فقط کسب نمره نیست. باید از هر آزمون اطلاعاتی دربارهی خودتان به دست آورید. بعد از هر آزمون، علاوه بر بررسی مسائل، عملکرد خودتان را نیز تحلیل کنید.
مثلاً بررسی کنید:
- آیا در انتخاب مسئلهی اول اشتباه کردید؟
- آیا زمان زیادی را روی یک ایدهی نادرست گذاشتید؟
- آیا مسئلهای را که میتوانستید حل کنید، به دلیل بیدقتی از دست دادید؟
- آیا کد شما بیش از حد پیچیده بود؟
- آیا باگهایی داشتید که میتوانستید با تست مناسب پیدا کنید؟
- آیا در انتهای آزمون زمان کافی برای بررسی کدها داشتید؟
- آیا در یک موضوع خاص ضعف داشتید؟
- آیا در زمان فشار و خستگی، کیفیت تصمیمگیری شما کاهش پیدا کرد؟
سعی کنید بعد از هر آزمون، چند نکتهی مشخص برای آزمون بعدی استخراج کنید. اگر هر آزمون فقط به یک نمره تبدیل شود، بخش بزرگی از ارزش آن را از دست دادهاید.
آزمونهای شبیه المپیاد جهانی
بخشی از آزمونهای دوره باید برای شبیهسازی شرایط واقعی المپیاد جهانی مورد استفاده قرار گیرد.
در چنین آزمونهایی باید خودتان را مجبور کنید شرایط مسابقهی واقعی را تجربه کنید: زمان محدود، چند مسئلهی دشوار، فشار روانی و نبودن کسی که بلافاصله به شما بگوید ایدهتان درست است یا نه.
در مسابقهی واقعی ممکن است feedback محدود باشد، ممکن است در مورد یک کد مطمئن نباشید و ممکن است شرایط دقیقاً مطابق انتظار شما پیش نرود. بنابراین باید به جایی برسید که بتوانید بدون وابستگی به شرایط ایدهآل، تصمیم درست بگیرید.
در آییننامهی دورهی طلا نیز بر آمادگی برای شرایطی تأکید شده است که حتی در صورت ایدهآل نبودن شرایط مسابقه بتوانید بهدرستی آزمون دهید؛ از جمله توانایی نوشتن برنامهی درست بدون وابستگی به feedback.
استراتژی مسابقه دادن
در این سطح، استراتژی مسابقه دادن به اندازهی دانش الگوریتمی اهمیت دارد.
هر دانشپژوه ممکن است استراتژی متفاوتی داشته باشد و قرار نیست همه دقیقاً یک روش را اجرا کنند. مهم این است که قبل از مسابقه، روش مناسب خودتان را پیدا کرده باشید.
برای مثال باید برای پرسشهای زیر پاسخ مشخصی داشته باشید:
- در ابتدای مسابقه چگونه مسائل را بررسی میکنم؟
- چه زمانی روی یک مسئله میمانم و چه زمانی سراغ مسئلهی دیگری میروم؟
- چگونه بین چند زیرمسئله یا راهحل مختلف انتخاب میکنم؟
- چه زمانی کدنویسی را شروع میکنم؟
- اگر بعد از کدنویسی باگ پیدا کردم، چه زمانی تصمیم میگیرم کد را اصلاح کنم و چه زمانی راهحل را عوض کنم؟
- در یک ساعت پایانی مسابقه چه کارهایی انجام میدهم؟
- اگر در یک مسئله کاملاً گیر کردم، چگونه از آن فاصله میگیرم؟
- اگر مسابقه مطابق انتظارم پیش نرفت، چگونه تمرکزم را حفظ میکنم؟
تجربهی اعضای تیمهای سالهای گذشته میتواند در پاسخ دادن به این سؤالها بسیار مفید باشد؛ اما در نهایت باید این روشها را در آزمونهای تمرینی امتحان کنید و ببینید کدام استراتژی با روحیات و تواناییهای شما سازگارتر است.
آزمون تمرینی جای امتحان کردن استراتژیهای مختلف است؛ آزمون انتخاب تیم و المپیاد جهانی جای این کار نیست.
برنامهنویسی تمیز و کمباگ
در دورهی طلا دیگر صرفاً «توانایی کدنویسی» کافی نیست. باید بتوانید کدی بنویسید که هم سریع نوشته شود، هم قابل اعتماد باشد و هم بتوانید در زمان کوتاه آن را اشکالزدایی کنید.
در مسابقهای که چند ساعت بیشتر طول نمیکشد، هر دقیقهای که به دلیل یک باگ ساده از دست میدهید میتواند ارزش زیادی داشته باشد.
بنابراین سعی کنید:
- کدهای خود را ساده و قابل فهم بنویسید.
- از پیچیده کردن غیرضروری کد خودداری کنید.
- برای قسمتهای حساس برنامه، تستهای مناسب طراحی کنید.
- قبل از ارسال، موارد مرزی را بررسی کنید.
- خطاهای رایج خودتان را شناسایی و ثبت کنید.
- روش مناسبی برای پیدا کردن باگ داشته باشید.
- روی کدهایی که میدانید احتمال خطا در آنها زیاد است، تستهای بیشتری انجام دهید.
نوشتن کد کوتاهتر و سادهتر معمولاً به معنی حرفهایتر بودن آن است، به شرط آن که خوانایی و درستی آن حفظ شود.
تستکردن و رفع باگ
یکی از تفاوتهای مهم بین یک برنامهنویس خوب و یک مسابقهدهندهی حرفهای، توانایی پیدا کردن سریع خطاهاست.
بعد از نوشتن برنامه، فقط چند نمونهی صورت سؤال را روی آن اجرا نکنید. به دنبال حالتهایی باشید که احتمال خراب شدن الگوریتم در آنها بیشتر است.
برای مثال:
- کوچکترین ورودیها
- بزرگترین ورودیها
- ورودیهای کاملاً تصادفی
- حالتهایی که همهی مقادیر برابرند
- حالتهایی که مقادیر کاملاً متفاوتاند
- حالتهایی که یک ویژگی خاص دقیقاً در مرز قرار میگیرد
- حالتهایی که پاسخ صفر یا حداقل ممکن است
- حالتهایی که پاسخ بیشترین مقدار ممکن است
در صورت امکان، از تستجنریتور و brute force برای مقایسهی راهحل خود با یک راهحل ساده استفاده کنید. یادگیری روش تستکردن، بخشی از آمادگی شما برای مسابقه است و نه کاری که فقط در مواقع خراب شدن برنامه انجام شود.
رفع نقاط ضعف شخصی
یکی از مهمترین تفاوتهای دورهی طلا با دورههای قبل این است که دیگر یک برنامهی یکسان برای همه مناسب نیست.
ممکن است یک دانشپژوه در گراف بسیار قوی باشد اما در DP ضعف داشته باشد و دانشپژوه دیگری دقیقاً شرایط معکوس را داشته باشد. بنابراین لازم است هرکس نقاط ضعف خودش را شناسایی کند و برای آن برنامهی مشخصی داشته باشد.
در طول دوره فهرستی از نقاط ضعف خود تهیه کنید. این نقاط ضعف میتوانند علمی، فنی یا مسابقهای باشند.
مثلاً:
- یک مبحث الگوریتمی خاص
- تشخیص ایدهی مناسب
- پیادهسازی
- مدیریت زمان
- تست کردن
- رفع باگ
- انتخاب مسئله
- حفظ تمرکز در ساعات پایانی مسابقه
- یا حتی بیدقتی در موارد ساده
برنامهی شخصی شما باید بر اساس همین نقاط ضعف تنظیم شود.
کلاسهای آموزشی
کلاسهای دورهی طلا با هدف پوشش کامل سیلابس IOI، عمیقتر کردن مطالب، رفع نقاط ضعف و آمادهسازی برای مسابقات برگزار میشوند.
در این دوره نباید کلاس را محلی برای یادگیری منفعلانه بدانید. اگر مطلبی را در کلاس یاد گرفتید، سعی کنید آن را در حل مسئله به کار ببرید.
همچنین ممکن است برخی مطالب فراتر از سیلابس رسمی IOI مطرح شوند. لازم نیست همهی این مطالب را به یک اندازه دنبال کنید. هدف اصلی شما باید توانایی حل مسئله باشد، نه صرفاً تمام کردن یک فهرست از الگوریتمها.
در کلاسها:
- سؤال بپرسید.
- سعی کنید قبل از دیدن راهحل، خودتان ایده پیدا کنید.
- اگر الگوریتمی را میشناسید، به این فکر کنید که چرا کار میکند و در چه مسائلی قابل استفاده است.
- مثالهای مختلف برای الگوریتم بسازید.
- بعد از کلاس، مطالب را خودتان بازسازی کنید.
- اگر مطلبی برایتان روشن نیست، آن را به یک نقطهی ضعف ثبتشده تبدیل کنید و برای رفع آن اقدام کنید.
طراحی سؤال
یکی از تمرینهای مفید در این دوره، طراحی سؤال است.
وقتی سعی میکنید برای یک ایدهی الگوریتمی مسئله طراحی کنید، مجبور میشوید دقیقتر بفهمید چه چیزی در آن ایده مهم است، چرا راهحل کار میکند و چگونه میتوان یک راهحل ساده را از راهحلهای پیچیدهتر جدا کرد.
بنابراین اگر فرصت داشتید، برای الگوریتمها یا ایدههایی که یاد گرفتهاید سؤال طراحی کنید و سعی کنید برای آن راهحل و تست مناسب نیز بسازید.
ارتباط با سایر دانشپژوهان
شما در دورهی طلا با افرادی کار میکنید که همگی از بهترین دانشآموزان المپیاد کامپیوتر کشور هستند.
این موضوع را صرفاً به عنوان یک رقابت نبینید. هرکدام از این افراد میتوانند منبع ارزشمندی برای یادگیری باشند.
از یکدیگر یاد بگیرید، دربارهی ایدهها صحبت کنید و تجربههای خود را به اشتراک بگذارید. البته در مورد آزمونهای دارای اثر مستقیم بر انتخاب تیم، قوانین و محدودیتهای تعیینشده توسط کمیته را کاملاً رعایت کنید.
همچنین مراقب باشید که مقایسهی دائمی خود با دیگران باعث از بین رفتن تمرکز شما نشود. در این مرحله ممکن است کسی در یک آزمون بسیار بهتر از شما عمل کند و در آزمون بعدی نتیجهی کاملاً متفاوتی بگیرد. چیزی که اهمیت دارد روند پیشرفت خود شماست.
آمادگی ذهنی برای انتخاب تیم
یکی از سختترین بخشهای دورهی طلا، کنار آمدن با این واقعیت است که ممکن است با وجود تلاش بسیار زیاد، در نهایت جزو چهار نفر تیم نباشید.
تنها چهار نفر انتخاب میشوند، اما ارزش دورهی طلا و چیزهایی که در آن یاد میگیرید به انتخاب شدن یا نشدن شما محدود نیست.
از طرف دیگر، نباید این موضوع را بهانهای برای کمکاری قرار دهید. تا آخرین روز باید برای بهتر شدن تلاش کنید و نتیجهی نهایی را به آزمونها بسپارید.
سعی کنید به جای فکر کردن دائمی به رتبهی فعلی خود، روی چیزهایی تمرکز کنید که در کنترل شما هستند:
- بهتر حل کردن مسئله
- کاهش اشتباهات
- افزایش سرعت
- شناخت نقاط ضعف
- بهتر شدن در آزمونهای شبیه IOI
- و حفظ آمادگی تا روز آخر
در رقابتی با هشت نفر از بهترینهای کشور، ممکن است فاصلهها بسیار کم باشد. بنابراین هیچ نتیجهای را زودهنگام قطعی تصور نکنید.
آمادگی برای شرایط غیرمنتظره
در مسابقهی واقعی ممکن است همهچیز مطابق برنامه پیش نرود. ممکن است یک مسئله بسیار دشوارتر از انتظار شما باشد، یک راهحل ساده به ذهنتان نرسد، برنامهتان باگ داشته باشد یا حتی شرایط فنی مسابقه کاملاً ایدهآل نباشد.
یکی از اهداف دورهی طلا این است که یاد بگیرید تحت چنین شرایطی نیز عملکرد خود را حفظ کنید.
بنابراین در آزمونهای تمرینی گاهی خودتان را در شرایطی قرار دهید که کاملاً مطابق برنامه نیست. یاد بگیرید اگر مسابقه بد شروع شد، مسابقه را برای خودتان تمامشده فرض نکنید.
یک مسابقهی پنجساعته مجموعهای از تصمیمهای متعدد است. خراب شدن یک ساعت اول الزاماً به معنی خراب شدن چهار ساعت بعدی نیست.
خواب، استراحت و زندگی خارج از المپیاد
دورهی طلا دورهای فشرده است، اما قرار نیست تمام زندگی شما به المپیاد تبدیل شود.
خواب کافی، استراحت و داشتن زمانی برای فعالیتهای غیر درسی به شما کمک میکند کیفیت کار خود را حفظ کنید. کاهش شدید خواب برای چند ساعت مطالعهی بیشتر ممکن است در کوتاهمدت مفید به نظر برسد، اما معمولاً باعث کاهش تمرکز و افزایش خطا میشود.
بهخصوص در روزهای نزدیک به آزمونهای مهم، بهتر است به جای تلاش برای جبران حجم زیادی از مطالب، با ذهنی آماده و آرام وارد آزمون شوید.
میزان و کیفیت کار
در دورهی طلا ممکن است تصور کنید برای موفقیت باید هرچه بیشتر و بیشتر کار کنید. این تصور تا حدی درست است؛ بدون تلاش مستمر و جدی، رسیدن به سطح موردنیاز این دوره ممکن نیست. اما افزایش تعداد ساعت مطالعه بهتنهایی تضمینکنندهی پیشرفت نیست.
در این مرحله، کیفیت کاری که انجام میدهید اهمیت بسیار زیادی دارد. ممکن است دو دانشپژوه هر دو روزی چند ساعت برای المپیاد وقت بگذارند، اما یکی از آنها بخش زیادی از این زمان را صرف حل عمیق مسئله، بررسی راهحلها و تحلیل اشتباهات خود کند و دیگری بیشتر وقت خود را صرف خواندن مطالبی کند که از قبل میداند یا حل مسائل سادهای کند که چالش چندانی برایش ایجاد نمیکنند.
بنابراین به جای اینکه صرفاً تعداد ساعت کار خود را زیاد کنید، سعی کنید از زمانی که در اختیار دارید بیشترین استفاده را ببرید.
چند نکته در این زمینه:
- برای خودتان برنامهای واقعبینانه داشته باشید و سعی کنید به آن پایبند بمانید. برنامهای که بیش از حد سنگین باشد و نتوانید به آن عمل کنید، معمولاً از یک برنامهی متعادل و پایدار نتیجهی بدتری خواهد داشت.
- همهی تمرینها را با یک روش و یک میزان زمان حل نکنید. بعضی مسائل برای یادگیری یک ایدهی جدید مناسباند، بعضی برای تمرین سرعت و بعضی برای شبیهسازی مسابقه.
- گاهی یک مسئلهی دشوار را مدت بیشتری دنبال کنید و تلاش کنید خودتان ایدهی آن را پیدا کنید. این نوع تمرین، حتی اگر در نهایت به حل مسئله منجر نشود، میتواند بسیار ارزشمند باشد.
- بعد از دیدن راهحل یک مسئله، زمان بگذارید تا بفهمید چرا خودتان به آن ایده نرسیدید و چگونه میتوانید در آینده زودتر چنین ایدهای را تشخیص دهید.
- بخشی از تمرینها را به صورت مسابقهای و با محدودیت زمانی انجام دهید و بخشی دیگر را بدون فشار زمانی و با تمرکز بر یادگیری عمیق حل کنید. هر دو نوع تمرین لازماند.
- اگر متوجه شدید ساعتهای بیشتری کار میکنید اما پیشرفت محسوسی ندارید، قبل از افزایش بیشتر ساعات کار، روش کار خود را بررسی کنید. شاید مشکل از کمبود زمان نباشد، بلکه از نحوهی استفاده از زمان باشد.
- خواب و استراحت را قربانی افزایش ساعت مطالعه نکنید. خستگی زیاد باعث کاهش تمرکز، افزایش بیدقتی و کاهش کیفیت یادگیری میشود.
- مهمتر از تعداد ساعت کاری در یک روز، استمرار شما در طول چند ماه دوره است. یک برنامهی قابلدوام که ماهها ادامه پیدا کند، از چند روز کار بسیار سنگین و سپس خستگی و رها کردن کار مؤثرتر است.
در نهایت، معیار خوبی برای ارزیابی یک روز کاری این نیست که «چند ساعت کار کردم؟» بلکه این است که «امروز چه چیزی یاد گرفتم، چه مهارتی بهتر شد و کدام نقطهی ضعفم را پیدا یا برطرف کردم؟»
در دورهی طلا قرار نیست صرفاً بیشتر از دیگران کار کنید؛ باید یاد بگیرید بهتر از گذشتهی خودتان کار کنید.
توصیههای پایانی
- در دورهی طلا قرار نیست همهچیز را از نو یاد بگیرید؛ قرار است دانستههای خود را به مهارت مسابقهای تبدیل کنید.
- تمرینها را جدی بگیرید، حتی اگر تحویل آنها اجباری نباشد.
- هر مسئلهای که حل نمیکنید، میتواند فرصتی برای پیدا کردن یک نقطهی ضعف باشد.
- بعد از هر آزمون، عملکرد خود را تحلیل کنید و فقط به نمره نگاه نکنید.
- برای خودتان دفترچه یا فهرستی از ایدهها، اشتباهات و نقاط ضعف داشته باشید.
- استراتژی مسابقه دادن خود را قبل از آزمونهای مهم پیدا کنید و آن را در مسابقات تمرینی آزمایش کنید.
- به اندازهی کافی روی تستکردن و رفع باگ کار کنید.
- به feedback وابسته نباشید و خودتان را برای شرایطی آماده کنید که همهچیز ایدهآل نیست.
- از تجربهی اعضای تیمهای سالهای قبل استفاده کنید، اما در نهایت روش مناسب خودتان را پیدا کنید.
- با دیگر دانشپژوهان رقابت کنید، اما از آنها نیز یاد بگیرید.
- تا روز آخر دوره برای بهتر شدن تلاش کنید.
- و مهمتر از همه، سعی کنید از این دوره لذت ببرید. شما در دورهای حضور دارید که فقط هشت نفر از بهترینهای کشور در آن کنار هم قرار گرفتهاند. این فرصت، حتی مستقل از نتیجهی انتخاب تیم، تجربهای کمنظیر برای یادگیری، رقابت و رشد است.