نکاتی دربارهی تمرین برنامهنویسی المپیاد و ACM
توی این یک ماه اخیر یه سری نکته در مورد پیشرفت توی برنامهنویسی المپیاد و ACM رو که خودم تو این مدت فهمیده بودم یا از آدمهای دیگه شنیده بودم رو به چندین نفر گفتم و روش تأکید کردم. دیدم خوبه که همهی اینا رو اینجا جمع کنم تا هم یه جا ثبت شده باشه هم نظرهای شما رو بشنوم و اگه اشکالی دارن اصلاحشون کنم.
همیشه آدمهای زیادی پرسیدن که چطوری توی المپیاد و ACM پیشرفت کنیم؟ چه کتابهایی بخونیم که قوی بشیم؟ این سوالها رو اگه از هر کسی که تو این زمینه مدتی بوده و پیشرفت کرده بپرسید میگه: «فقط تمرین کن».
تازهکار / اول راه
خوب حالا من قصد دارم بگم با توجه به چیزهایی که شنیدهام و دیدهام تمرین مفید چی میتونه باشه و چطوری میشه مسیر پیشرفت رو طی کرد. تو تلاش اول هرکسی که میره دنبال یه موضوعی تا در اون مورد یاد بگیره و پیشرفت کنه دنبال یک سری کتاب تو اون موضوع میگرده تا بخونه. ولی موضوع المپیاد و ACM خیلی فرق میکنه. یک مثال مسخره میتونه این باشه که یکی میخواد بدنسازی کار کنه واسه همین میره کتاب و مجله در مورد بدنسازی میخونه. سودی که کتاب برای این فرد داره اینه که اینطوری با وسایل ورزشی و روش استفادهشون آشنا میشه و وقتی برای اولین بار وارد باشگاه میشه سرش گیج نمیره. حالا اگه کسی کتاب الگوریتم یا برنامهنویسی بخونه فقط روش کار با ابزارهای مورد نیاز توی مسابقههای برنامهنویسی رو یاد گرفته و تا حدی میتونه سر در بیاره که چه خبره.
دیده شده بچههای المپیادی قبل از این که المپیاد رو شروع میکنن میافتن دنبال خرید انواع کتابهای گرون و نایاب در مورد المپیاد و الکی وقت و پول خودشون رو هدر میدن. کتاب خوبه، ولی قدرت حل مسأله برنامهنویسی شما رو زیاد نمیکنه!
برای شروع برنامهنویسی المپیاد و ACM باید یه زبان برنامهنویسی رو تا حد معمولیای بلد بود و تقریبن با الگوریتمهای کلاسیکی که توی همهی کتابهای الگوریتم پیدا میشه آشنا بود. این اطلاعات رو که داشته باشید میتونید توی مسابقههای آنلاین سایتهای مختلف شرکت کنید و مسالههای مسابقههای قبلی اونها رو حل کنید. معمولن برای هر سوال معلومه که چند نفر اون رو حل کردن و میتونید بر حسب این تعداد سوالهای با سختی مناسب سطحتون رو پیدا کنید. توصیه میشه تا میتونید سوال حل کنید و اگه راه حل سوالی رو میدونید حتمن کدش رو بزنید.
برای تمرین یکی از سایتهای بسیار فعال و مفید codeforces.com هست که هم به المپیادیها و هم به ACMایها پیشنهاد میشه.
متوسط / وسط راه
تا به حال باید بدونید که مسالهها طبق راه حلشون به چندین دسته تقسیم میشن (الگوریتمهای گراف، برنامهنویسی پویا، روش حریصانه و ...) و با توجه به مطالعاتی که در مورد الگوریتمها داشتهاید احتمالن بتونید مسالههای نسبتن سادهی هر مبحث رو حل کنید. تو این مرحله روی خوب کردن دو تا چیز تمرکز کنید.
- قدرت حل مسأله؛ میزان مهارتی که در به دست آوردن راه حل درست مساله و طراحی الگوریتمش دارید.
- مهارت کد زدن؛ میزان دقت، سرعت و مهارتی که در پیادهسازی الگوریتم مسالههایی که حل کردید دارید.
همونطور که بعد از یه مدت مساله حل کردن دستتون میاد، خیلی از مسالهها از قالبی تکراری پیروی میکنن و شبیه مسالههایی هستند که قبلن حل کردید. برای همین کسب تجربه و حل مسالههای متفاوت موقع تمرین خیلی کار مهمیه. بعضیها وقتی یک سوال رو نمیتونن حل کنن سریع میرن دنبال این که جوابش رو جایی بخونن، و بعضیها هم بعد از یه مدت فکر کردن از حل سوال منصرف میشن و ولش میکنن. هردوی این حالتها بده. اگر زود برید دنبال جواب باعث میشه به ذهنتون فرصت تمرین و قوی شدن نداده باشید. و اگه بیش از یه حدی روی یک سوال کار کنید وقتتون رو هدر دادید. و اگه رها کنیدش، یه چیزی که میتونستید یاد بگیرید رو از دست دادید. من به شخصه پیشنهاد میکنم که روی یک سوال حداقل ۲ ساعت وقت فکر کردن بذارید و تا وقتی که فکر میکنید ممکنه به جواب برسید روش فکر کنید. بعد از این که دیگه از حل سوال منصرف شدید سعی کنید ایدهای رو که بلد نبودید رو با خوندن راه حل سوال یا پرسیدن حلش از یکی دیگه یاد بگیرید. هیچ وقت یک سوال حل نشده رو رها نکنید!
مهارت کد زدن باید متناسب با قدرت حل مساله پیش بره. اگه توی یه مسابقه دیدید که یک سوال رو راهش رو میدونید ولی نتونستید پیاده سازی کنید باید کد زدنتون رو قوی کنید. برای قوی شدن مهارت کد زدن باید سوالهای سادهای رو که راهشون براتون آسون شده رو بیخیال نشید و حتمن کدش رو بزنید. و همچنین قبل از پیادهسازی به جزئیات پیادهسازی فکر کنید.
کل دو پاراگراف قبل توی چند جملهی بسیار بسیار مهم خلاصه میشه و اون هم اینه: وقتی که یک سوال رو میبینید روی سوال به اندازهی کافی فکر کنید، اگه حل نشد راهش رو بخونید. در صورتی که خودتون سوال رو حل کردید یا راهش رو خوندید به هیچ وجه تا وقتی که کدش رو نزدید بیخیالش نشید.
اگه با همین روش ۲۰۰-۳۰۰ تا سوال حل کنید که براتون در اون لحظه آسون نبوده باشه مطمئن باشید که به طرز غیر قابل مقایسهای پیشرفت میکنید.
پیشرفته / این راه پایانی ندارد...
بعد از مدتی تمرین احتمالن به جایی میرسید که سرعت رشدتون خیلی کند شده و هنوز حس میکنید که خیلی با حالت ایدهآل فاصله دارید. من بیشتر تأکیدم برای نوشتن این پست روی این بخش بود و اگه ادامهای بر این پست باشه احتمالن نکاتی به این بخشش اضافه خواهم کرد. توصیههایی که دارم و تجربههایی که برای این بخش کسب کردم و حرفهایی که از آدمای حرفهای در این ضمینه زمینه شنیدهام رو میگم.
- مهارت حل مسالهی ریاضی خودتون رو زیاد کنید؛ اکثر افرادی که توی المپیاد و ACM در سطح دنیا موفق عمل میکنن توی المپیاد ریاضی و حل مسالههای ریاضی هم حرفی برای گفتن داشتن و این توی برنامهنویسی هم بهشون کمک کرده. میشه گفت داشتن دید ریاضی در حل مسائل برنامهنویسی المپیاد و ACM مفیده.
- یک مجموعه سوال رو انتخاب کنید و حل کنید؛ منظور از حل مجموعه سوال انتخاب کردن تعدادی سوال هست که شامل سوالهای خیلی سخت هم باشه. برای مثال برای المپیادیها میشه حل کل دورههای IOI به طور کامل و برای ACMای ها میشه حل چند دوره از مسابقههای منطقهای ACM روسیه به طور کامل. خوبی حل کردن مجموعه سوال به طور کامل اینه که مجبور میشید همه مدل سوال رو حل کنید و توی مبحثهایی که حرفهای نیستید هم پیشرفت کنید.
- سعی کنید سطح مسالههایی که حل میکنید از سطح مسابقاتی که توش میخواید شرکت کنید بالاتر باشه؛ به هر حال خوبه که هدفتون رو بزرگ بگیرید تا به نتایج بهتری برسید.
- فقط تمرین کنید...
خیلی دوست دارم این پست رو بهتر کنم و نکات بیشتری بهش اضافه کنم. مخصوصن بخش آخرش. پذیرای نظراتتون هستم.
پ.ن. پست از چیزی که فکر میکردم خیلی طولانی تر شد!
- شنبه, ۱۳ آبان ۱۳۹۱، ۰۵:۰۴ ب.ظ
:-اولین نظر :)))