من در سال اول دبیرستان شروع به یادگیری ++C از ابتدا کردم. من چیزی در مورد برنامه نویسی، الگوریتم ها یا ساختار داده نمی دانستم. هفت ماه بعد از اینکه اولین خط کدم را نوشتم، المپیاد محاسباتی به در می زد. و این زمان عالی بود تا ببینم آیا سبک یادگیری من 5 سنت ارزش دارد یا خیر.
بعد از 2 روز رقابت، نتایج به دست آمد: من مدال طلا را کسب کردم.
سفارش ساخت سایت در فریلنس پروژه ,برنامه نویسی و دانش کدنویسی پایه اصلی طراحی سایت است
من شوکه شدم زیرا با 5 سال تجربه از رقبا پیشی گرفته بودم. می دانستم سخت کار کرده ام، اما این موفقیت فراتر از انتظارم بود. مسابقه برنامه نویسی با من کاملاً مطابقت داشت و من در این زمینه به صورت همه جانبه شرکت کردم.
من می دانم چه چیزی باعث موفقیت من شد و می خواهم این را با شما به اشتراک بگذارم.
چه زبانی را باید انتخاب کنید؟
C++ – به شدت توصیه می شود! خیلی سریع است پیاده سازی الگوریتم های مختلف به دلیل STL زمان کمی می برد. C++ در تمامی مسابقات پذیرفته می شود. من از اولین خط کدم از آن استفاده کرده ام.
ج – به دلیل STL بروید و C++ را یاد بگیرید. اگر با زبان C آشنایی دارید، آماده کدنویسی در C++ نیز هستید.
جاوا – کند است. اما دارای کلاس Big Integer است، حتی اگر مشکلات بسیار کمی وجود داشته باشد که نیاز به استفاده از آن داشته باشد. اگر محدودیت زمانی تنگ باشد، از محدودیت زمانی فراتر رفته است. جاوا در همه مسابقات پذیرفته نمی شود.
کجا می توانید تمرین کنید؟
من Sphere Online Judge (SPOJ) را توصیه می کنم. از نظر کیفیت و کمیت موثر است. سرمقاله ها و راه حل ها به صورت آنلاین در دسترس هستند اگر هنگام حل مشکلات گیر کنید. پشتیبانی از وب سایت های SPOJ Toolkit و طبقه بندی کننده مشکل برای SPOJ.pl.
ابتدا باید به اصول اولیه تسلط داشته باشید.
پس از اینکه به نحو زبان عادت کردید، نوبت به حل برخی مشکلات می رسد. با موارد ساده ای که نیاز به مهارت های اجرایی دارند شروع کنید. در این مرحله هدف شما تعریف سبک کدنویسی است. شاید دوست دارید با فاصله زیاد بنویسید، شاید هم نه. شاید پرانتزها را با عبارت «اگر» در یک خط قرار دهید، شاید نه.
شما باید سبک کدنویسی خود را پیدا کنید زیرا این سبک مال شماست.
(برای انجام پروژه متلب مهارت برنامه نویسی الزامی است)
و این دو اصل را در هنگام توسعه سبک کدنویسی خود در نظر داشته باشید.
پیاده سازی آسان. شما باید در اجرای راه حلی که به آن دست یافته اید احساس راحتی کنید. چرا؟ زیرا در طول مسابقه، آخرین چیزی که می خواهید بیفتد این است که در کد خود گم شوید. همیشه بهتر است به جای صرف 10 دقیقه بیشتر برای اجرای آن، 5 دقیقه بیشتر در مورد اجرا فکر کنید.
آسان برای خواندن. این به معنای «اشکالزدایی آسان» است. بیایید با آن روبرو شویم، هر دوی ما می دانیم که اشکالات همیشه ظاهر می شوند. آیا این حس را میشناسید که 10 دقیقه فرصت دارید و آن حشره لعنتی را پیدا نمیکنید؟ بله، شما انجام می دهید. برای حل آن باید کد خوانا بنویسید. بنابراین وقتی شروع به اشکال زدایی می کنید، دنبال کردن کد طبیعی و ساده به نظر می رسد.
در اینجا سبک کدنویسی من است.
چگونه مهارت های پیاده سازی خود را تقویت کنیم؟
تمرین، تمرین و تمرین بیشتر. من به شما توصیه می کنم که اولین 250 مشکل حل شده را در SPOJ کار کنید. آنها را دقیقا به همین ترتیب حل کنید. و حداقل یک ساعت به راه حل فکر کنید.
نگویید “این مشکل برای من خیلی سخت است، مشکل بعدی را امتحان خواهم کرد”. این ذهنیت بازنده است.
یک تکه کاغذ و یک مداد بردارید و سعی کنید فکر کنید. به این ترتیب، احتمالاً راه حل را پیدا خواهید کرد، اما مطمئناً تفکر الگوریتمی را توسعه خواهید داد. اگر در عرض یک ساعت راه حل را پیدا نکردید، می توانید برای دیدن راه حل به انجمن یا سرمقاله ها نگاهی بیندازید.
نتایج این رویکرد؟ اجرای سریع. و یادگیری مسائل و الگوریتم های کلاسیک.
در مرحله دوم، شما باید به الگوریتم ها و ساختارهای داده تسلط داشته باشید.
طراحی لوگو با بهترین طراحان لوگو در فریلنس پروژه ))
یک رویکرد سلسله مراتبی را دنبال کنید. آیا بدون دانستن راه رفتن شروع به دویدن کردید؟ نه. آیا می توانید یک آسمان خراش بدون پایه محکم بسازید؟ باز هم نه.

این بدان معنی است که شما نمی توانید مراحل را در مسیر یادگیری خود بسوزانید. یا اگر این کار را انجام دهید، با شکاف های دانشی باقی خواهید ماند که با گذشت زمان عمیق تر می شوند.
با الگوریتم های اساسی و ساختارهای داده شروع کنید.
شروع کردنش سخته احتمالاً به این دلیل که نمی دانید ابتدا چه چیزی را یاد بگیرید. به همین دلیل است که من یک دوره ویدیویی الگوریتم ها و ساختارهای داده ایجاد کرده ام. من این دوره را به روشی که ای کاش به من آموزش داده می شد، گذراندم. پاسخ باورنکردنی بود، بیش از 3000 دانش آموز از 100+ کشور در ماه اول به آن ملحق شده بودند.
اگر با مشکلات آسان کار کنید، هرگز بهتر نخواهید شد.
موثرترین راه برای یافتن چیزی که نمی دانید این است که واقعاً با آن روبرو شوید. این چیزی است که برای من اتفاق افتاده است. من با انتخاب یک مشکل سخت، تکنیک های جدید زیادی را یاد گرفتم که قبلاً هرگز در مورد آنها نشنیده بودم.
از هر 3 مشکلی که حل می کنید، یکی باید چیز جدیدی به شما بیاموزد. اگر نه، آنها را با دقت بیشتری انتخاب کنید. مشکلات سخت تر را انتخاب کنید!
پس از اتمام آن 250 مشکل از SPOJ، مروری بر موضوعات اصلی برنامه نویسی رقابتی خواهید داشت. با درک عمیق منطق پشت الگوریتم های اساسی، درک الگوریتم های سطح بالا آسان به نظر می رسد. بنابراین شما می توانید به سرعت اهرم
دانش خود را بدست آورید
اکنون هر موضوع اصلی را عمیق تر کنید.
در اینجا یک منبع فوق العاده با 10 الگوریتم برتر و ساختار داده در هر موضوع وجود دارد. پس از آن 250 مشکل از SPOJ، شما بسیاری از آن لیست را خواهید شناخت. اما هنوز خیلی ها هستند که تا به حال درباره آنها نشنیده اید. پس شروع به یادگیری آنها به ترتیب صعودی کنید.
اگر دانش خود را پس از یادگیری چیزی جدید تقویت نکنید، آن را فراموش خواهید کرد.
توصیه می کنم پس از یادگیری یک الگوریتم جدید، 2 تا 3 مسئله را با استفاده از آن تمرین کنید. برچسب الگوریتم را در SPOJ جستجو کنید و مشکلاتی را پیدا خواهید کرد که به آن نیاز دارند. قبل از هر کاری آنها را کار کنید.
برنامه نویسی پویا را درک کنید زیرا باعث برنده شدن شما می شود.
از تجربه من، در هر مسابقه حداقل یک مشکل برنامه نویسی پویا وجود دارد. بسیاری از مردم با شنیدن DP دچار سردرد می شوند زیرا آن را درک نمی کنند.
و این چیز خوبی است. زیرا اگر شما واقعاً DP را درک کنید، برنده خواهید شد.
من DP را دوست دارم، این موضوع مورد علاقه من است. و راز DP اینجاست: در سطح جهانی بهینه فکر کنید، نه فقط محلی. شما باید مسئله را به زیرمسئله های ساده تر تقسیم کنید، هر یک از آنها را فقط یک بار حل کنید، و راه حل را با ترکیب این زیرمشکل های حل شده بسازید. متضاد DP یک الگوریتم حریصانه است زیرا دومی در هر مرحله گزینه بهینه محلی را انتخاب می کند. و انتخاب های بهینه محلی ممکن است منجر به یک راه حل جهانی بد شود.
هنگام یادگیری مفاهیم جدید، آموزش های TopCoder را بررسی کنید. آنها بسیار دقیق و آسان برای پیگیری هستند. من واقعاً درختان باینری ایندکس شده را از آنجا درک کرده ام.
سخت کار کن
آیا تا به حال در مورد ورزشکارانی شنیده اید که بدون سال ها تمرین قهرمان المپیک می شوند؟ من ندارم.
هر سال مقدمات المپیاد محاسباتی از شهریور ماه آغاز و در فروردین ماه به پایان می رسید.
در این 8 ماه هر روز 5 ساعت تمرین می کردم.
و بله، من این 5 ساعت را صرف حل مسائل الگوریتمی کردم. روزهایی را به خاطر می آورم که حتی 8 یا 10 ساعت را صرف تمرین می کردم. چرا؟ چون به آن علاقه داشتم. هر روز پس از بازگشت از مدرسه به خانه، مستقیماً به اتاق خوابم می رفتم و شروع به حل یک مشکل جدید می کردم. یا یادگیری یک الگوریتم جدید لازم برای آن مشکل.
اگر می خواهید برنده شوید، باید همین کار را انجام دهید. یک مشکل را در نظر بگیرید و به آن بچسبید. در طول برنامه روزانه خود به آن فکر کنید. مثلا در راه رفتن به سوپرمارکت یا در حین رانندگی.
آیا می دانید هنگام خواب، مغز شما اطلاعات جمع آوری شده در آن روز را یکپارچه می کند؟ مثل این است که کتاب ها را به ترتیب حروف الفبا در یک قفسه کتاب قرار دهید. اساساً مغز شما به مشکلات مختلفی که با آنها برخورد کرده اید فکر می کند.
در اینجا آمده است که چگونه می توانید از این مزیت استفاده کنید. قبل از اینکه بخوابید یک مشکل سخت را بخوانید و آنچه را که نیاز دارد به خاطر داشته باشید. در این مرحله، شما نیازی به یافتن راه حل ندارید. سپس به خواب می روید و مکانیسم مغز شما شروع به پردازش این مشکل می کند. وقتی از خواب بیدار می شوید شگفت زده خواهید شد: راه حل را هنگام خواب پیدا کرده اید.
خودتان آن را امتحان کنید. حس جادویی داره
من یک Vlog راه اندازی کردم
این پاراگراف کوتاه با برنامه نویسی رقابتی مرتبط نیست. من فقط می خواستم به شما اطلاع دهم که اگر در دهه 20 خود هستید و برایتان جالب است که من دنیا را چگونه می بینم، من در حال ساخت یک وبلاگ یوتیوب هستم. من در مورد جهان، زندگی و علوم کامپیوتر صحبت می کنم.
با زیرکی کار کن.
این راز موفقیت است. شما به اهداف نیاز دارید.
ما انسان هستیم و دوست داریم کارها را به تعویق بیندازیم. این به معنای به تعویق انداختن کارهایی است که باید همین الان انجام دهید. تماشای Netflix همیشه راحتتر از مشکلات DP است. شما این را می دانید و باید آن را اصلاح کنید.
چگونه می توانید اهمال کاری را شکست دهید؟
با در نظر گرفتن اهداف همیشه مشکلات جالبی پیدا خواهید کرد که از آنجا می توانید چیز جدیدی یاد بگیرید (منابعی را که در بالا به شما دادم بررسی کنید). اما آن مشکلات را باید حل کرد نه اینکه فقط خواند.
بنابراین در اینجا آمده است که چگونه بر اهمال کاری غلبه کردم. من یک تقویم کاغذی درست کرده ام و آن را با مشکلاتی که می خواستم هر روز حل کنم پر کردم. و من همیشه دو روز قبل را با مشکلات پر کرده ام، بنابراین می دانستم چگونه در روزهای بعد زمان خود را مدیریت کنم.
به این ترتیب همیشه انگیزه داشتم مشکلات را تمام کنم و مشکلات جدیدی پیدا کنم تا در روزهای بعد تقویم را پر کنم. وقتی مشکلات را حل می کنید، این یک احساس ارزشمند است. میدونم تو هم دوست داری
تقویم کاغذی خود را انجام دهید. چک لیست دیگری در تلفن خود ایجاد نکنید، که فردا برای شما مهم نیست.
چگونه به طور موثر اشکال زدایی کنیم؟
آیا می خواهید حرفه ای شوید؟ اگر چنین است، باید «در ذهن خود اشکال زدایی» کنید.
این تا حد زیادی کارآمدترین تکنیک اشکال زدایی است که من می شناسم زیرا اصلاً به دیباگر نیاز ندارد. مغز شما چندین مسیر کد را به طور همزمان کاوش می کند و در مقایسه با دیباگر کلاسیک، دیدگاه بسیار گسترده تری از کد را به شما ارائه می دهد.
این شبیه توانایی استادان بزرگ برای بازی شطرنج و فکر کردن به 3 حرکت از قبل است.
من از این تکنیک منحصراً به عنوان خط دفاع اولیه خود استفاده می کنم و در آخرین نمونه از یک دیباگر واقعی استفاده می کنم.
برای یادگیری «اشکالزدایی در ذهن» باید تمرین کنید. وقتی مشکلی را ارسال میکنید و «پاسخ اشتباه» را دریافت میکنید، مستقیماً به دکمه رفع اشکال نروید. در عوض، شروع به خواندن کد کنید و فکر کنید “چه اتفاقی می افتد”.

