یک شنبه, تیر 28. 1388IAUM CCC 6 - Online Round 1مسابقه ی آنلاین دوم نیز برگزار شد. سوال های A و D و G را من طرح کرده بودم. برای دریافت صورت سوال ها به http://pykello.net/iaum-c3-6-1.tar مراجعه کنید. سوال A، تنها یک پیاده سازی معمولی بود. برای دیدن کد من برای این سوال به http://wiki.pykello.net/doku.php?id=implementation:iaumc3_cheaters مراجعه کنید. سوال D، یک سوال احتمالاتی بود که از سوال احتمالاتی دفعه ی پیش کمی آسان تر بود. راه حل من برای این سوال از نوع برنامه سازی پویا بود. تنها مشکلی که برخی از شرکت کننده ها داشتند این بود که بعضی جاها 0.00000- چاپ می کردند به جای 0.00000 که چون به نظرم مشکل حادی نبود، یک clarification فرستادم تا ملت این مشکل را درست کنند. برای دیدن کد من برای این سوال به http://wiki.pykello.net/doku.php?id=implementation:iaumc3_quiz مراجعه کنید. راه حل من برای سوال G جستجوی دودوئی بود. برای اینکه بفهمم آیا با زمان x می شود به هدف رسید، ترتیب های مختلف نقاط را امتحان می کردم. مکان هندسی که هر کدام از نقاط در زمان x می توانند به آن بروند یک دایره است. اگر اشتراک تمام این دایره ها ناتهی بود، با زمان x می شود به هدف رسید، وگرنه نمی شود. برای دیدن کد من برای این سوال، به http://wiki.pykello.net/doku.php?id=implementation:iaumc3_atoms مراجعه کنید. لطفا نظرتان را درباره ی سوال ها به صورت کامنت یا ایمیل ارسال کنید. پ.ن. : ایده ی سوال G برگرفته از http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3159 بود، که توضیح راه حل را می توانید در http://wiki.pykello.net/doku.php?id=zju:feburary09 پیدا کنید. دلیلی که باعث شد فکر کنم تغییر من بر روی این سوال تبدیل به یک سوال جدید جالب می شود، این بود که گمان می کردم قسمت اشتراک دایره ها سخت ترین بخش سوال است، و راه حل های اولی که به ذهنم رسیده بود هم سخت بود، ولی راه حل آخرم چندان هم سخت نبود :) در ضمن، نمی دانم چرا سوال B با اینکه سخت نبود تنها توسط یک نفر حل شد. جمعه, تیر 26. 1388IAUM CCC 6 - Online Round 0امروز مسابقه ی آنلاین اول IAUM CCC 6 برگزار شد. سه سوال از 7 سوال توسط من طرح شده بود. در این پست، ابتدا انتقاداتی از طرز انتقاد مسابقه دهندگان می کنم، و سپس به توضیح کوتاهی در باره ی سوال ها می پردازم. سه سوال A و B و G توسط من طرح شده بود. برای دریافت صورت سوال ها، به آدرس http://pykello.net/iaumc3-6-0.tar مراجعه کنید. البته صورت سوال B در مسابقه یک اشتباه تایپی داشته که در این نسخه درست شده است. سوال A مشکل خاصی نداشت، راه حل من که سعی کردم کندترین راه حل معقول باشد( از مرتبه ی زمانی (O(n^2 بود)، در کمتر از یک ثانیه اجرا می شد. سوال آسانی بود، و وقتی کد طولانی برخی شرکت کنندگان را دیدم بسی تعجب کردم. و واقعا چگونگی دست یافتن برخی شرکت کننده ها به نتیجه ی Time Limit Exceeded واقعا حیرت آور بود. به هر حال، عده ای به طرز Judge شدن این سوال معترض بودند که دلیلش را نمی دانم. من هم جزو Judge ها نبودم تا دلیل اعتراض آن ها را بدانم. داده های تست مشکلی نداشت. تعداد زیادی از افراد با اینکه در صورت سوال ذکر شده بود نقطه ای با مختصات (0,0) در ورودی نیست، باز هم وجود چنین نقطه ای را سوال می کردند. سوال B ... معترضین به این سوال سه دسته بودند. دسته ای که معنی "متوسط" را بلد نبودند، و صورت سوال را مبهم می دانستند. اولا اینکه در صورت تمایل دوستان، می توانم بیش از 10 سوال مشابه پیدا کنم که بدون تعریف معنی متوسط، مقدار متوسط را خواسته بودند. پس اینکه تعریف "متوسط" را شخصی بلد نیست، ضعف در صورت سوال محسوب نمی شود. مبهم دانستن این مساله مانند این است که عدم ذکر معنای کوتاه ترین مسیر در مساله ی گراف را دلیل مبهم دانستن آن سوال بدانیم. سوال G، تقریبا کسی به طور جدی به این سوال نپرداخت، با اینکه از لحاظ ایده ای سخت نبود، ولی شاید پیاده سازی اش کمی طول می کشید و سوال های دیگر زمانی برای این سوال باقی نگذاشته بودند. در باره ی ایده ها: تنها به توضیح مختصری و کدها بسنده می کنم. ممکن است در آینده توضیح بیشتری بنویسم! سوال A: برای دیدن کد من برای این سوال به http://wiki.pykello.net/doku.php?id=implementation:iaum_c3_6_sight مراجعه کنید. تنها نکته ای باید در نظر می گرفتید این بود که مثلا اگر دو نقطه در (1,1) و (1-,1-) قرار داشته باشند، هر دو نقطه را می بینیم، با اینکه نسبت x/y هر دو یکسان است. سوال B: برای مشاهده کد من برای این سوال به http://wiki.pykello.net/doku.php?id=implementation:iaum_c3_6_kconsecutive مراجعه کنید. کسانی که با معنای "متوسط" یا "امید ریاضی" در نظریه ی احتمال آشنا نیستند، به http://en.wikipedia.org/wiki/Expected_value مراجعه کنند. فرض کنید [expDays[i برابر با تعداد متوسط روزهای لازم برای اینکه عمل سکه انداختن تمام شود با فرض اینکه i دفعه ی قبلی نتیجه سکه انداختن ها شیر بود، باشد. همانطور که معلوم است، expDays[k] = 0 است، چون k بار شیر پشت سر هم رخ داده است و بازی تمام شده است. در غیر اینصورت، expDays[i] = expDays[i+1] * p + expDays[0] * (1-p) + 1 است. عدد 1، برای این است که حتما یک بار سکه پرتاب می کنیم. با احتمال p، به حال [expDays[i+1 میرویم، یعنی به تعداد شیرهای پشت سرهم یکی اضافه می شود. و با احتمال q=1-p، به حالت [expDays[0 می رویم، یعنی تعداد شیرهای پشت سرهم به صفر می رسد. تابع calcDays در واقع این دنباله را محاسبه می کند. تابع calcMoney نیز از روشی مشابه ولی کمی پیچیده تر برای محاسبه متوسط پول استفاده می کند. سوال G: برای مشاهده ی کد من برای این سوال، به http://wiki.pykello.net/doku.php?id=implementation:iaum_c3_6_grid مراجعه کنید. راه حل مطلوب این سوال، از نوع برنامه سازی پویا بود. حالت برنامه سازی پویا نیز (شماره سطر، شماره ستون، بیت های لازم از وضعیت سطر بالا، بیت های لازم از وضعیت سطر فعلی) است. اگر این مدل را بصورت بدیهی پیاده سازی کنید، مسلما تعداد حالات خیلی زیاد خواهد بود. ولی باید دقت کنید در این مساله وضعیت سطری به طول n حداکثر می تواند (F(n) = F(n-1) + F(n-3 حالت داشته باشد، که برای n=30، کمتر از 500000 حالت می شود که زیاد نیست. با کمی طراحی خوب، می توان در بدترین حالت در زمان کمتر از 2 ثانیه به هر ورودی جواب داد. خوب :) دوست دارم نظرتان در باره ی سوال ها را بدانم. لطفا کامنت یا ایمیل ارسال کنید! دوشنبه, مرداد 28. 1387IAUM CCC 5
بالاخره، مرحله نهایی مسابقه ی IAUM CCC 5 برگزار شد، و تنها چیزی که برای من به جا ماند، خاطره ای نسبتا خوش بود! هرچند از چند روز قبل از مسابقه تا اتمام مسابقه ی نهایی استرس شدیدی داشتم و آرزوی اتمام این لحظات را داشتم، ولی پس از اتمام مسابقه ی نهایی و شنیدن نظرات شرکت کنندگان، احساس رضایت کردم. من فقط یک طراح سوال و داور بودم، و عضو هیئت اجرایی نبودم، با این حال، در این مدتی که در مشهد بودم، تلاش قابل تقدیر دانشجویان دانشگاه آزاد مشهد را مشاهده کردم، و از ته دل آرزو کردم که این مسابقات باز هم ادامه داشته باشد. احتمالا مهم ترین دلیل اینکه هر سال شرکت کنندگان این مسابقات بیشتر می شود، و افراد قوی تری هر سال جذب این مسابقات می شوند، برگزاری بسیار خوب این مسابقات است. به نظر من، یکی از نکات مثبت حضور داشتن در این مسابقات آشنا شدن با افرادی است که علايقم با علايق آن ها همپوشانی دارد، ولی قبلا با آن ها آشنا نبودم، و این احساس خوبی در من ایجاد می کند. نظرم در رابطه با نتیجه ی مرحله ی نهایی: گمان کنم چند نفر از افراد، احتمالا به علت عوامل جانبی (مانند استرس سر مسابقه، ...)، و نه به علت ضعف در حل مساله و توانایی علمی، ضعیف تر از توان واقعی خود عمل کردند و نتیجه نهایی کمی اعجاب انگیز بود. برنده ی نهایی مسابقه، آقای نیما احمدی پور بود، که بسیار خوب عمل کرد، و توانست همه ی مسائل را حل کند. به هر حال، تعداد زیادی از شرکت کننده ها را می شناختم و با تعدادی از آن ها دوست بودم، و از خوب عمل کردن خیلی های خوشحال شدم، و از بد عمل کردن خیلی ها ناراحت. با این حال، عادی است که شدیدا دوست داشته باشم که کسی که دو سال هم تیمی ام بود، و یک ترم هم اتاقی، و برای باقی عمرم یک دوست بسیار خوب، یعنی محمدرضا خانی، خیلی خوب عمل کند. نتیجه نهایی او (یعنی چهارم) خوب بود، ولی با توجه به اینکه به نظر من باهوش ترین عضو تیم Dreamers United بود، گمان می کنم می توانست بهتر از این هم عمل کند. احتمالا یکی از دلایل اینکه خیلی خوب عمل نکرد، کمبود تمرین در چند ماه اخیر بود. امیدوارم هر روز موفق تر از دیروز باشد. در ادامه به توضیح مختصر در مورد سوالاتی که من طرح کرده بودم می پردازم: مسابقه نیمه نهایی صفر(لینک سوالات) سوال C - کوتاه ترین زیر رشته ی نا مشترک : این سوال را با استفاده از Trie و مرتبه ی زمانی (O(n^2 حل کرده بودم، ولی راه حل های با مرتبه ی زمانی (O(n^2 log n نیز پذیرفته می شدند. سوال D - مربع ها : هدف این بود که راه حل های (O(n^2 (برنامه نویسی پویا) و (O(n^2 log n (تبدیل به هیستوگرام و مرتب سازی و ...) پذیرفته شوند، ولی متاسفانه داده های تست ضعیف بود و راه حل (O(n^3 نیز پذیرفته می شد. سوال E - تطبیق الگو : این سوال قرار بود سخت ترین سوال مسابقه باشد، ولی به علت عدم دقت در تنظیم محدودیت ها، آسان ترین سوال مسابقه بود! (مثلا باید اگر طول الگو 20000 بود و تعداد علامت سوال ها حداکثر 100، در آن صورت، بازهم راه حل خوبی برای حل مساله وجود داشت، ولی راه حل بدیهی خوب عمل نمی کرد.) با همین محدودیت ها، راه حل بدیهی به خوبی جواب می دهد. ولی اگر محدودیت ها خیلی سخت تر از این بودند، نسخه ی تغییر یافته ای از KMP، یا استفاده از Aho-Corasick می توانست مساله را به خوبی حل کند. سوال F - شمارش جفت ها : قرار بود راه حل (O(n log n پذیرفته شود، ولی ظاهرا برخی از شرکت کننده ها با راه حل (O(n^2 محدود شده نیز توانسته بودند این سوال را حل کنند. جمع بندی :در مجموع، از این مسابقه چندان راضی نبودم! چون زیاد اشتباه کرده بودیم! در انتها نیز دو نفر (نیما احمدی پور، و حامد احمدی) توانستند تمام سوالات را حل کنند، و حامد احمدی عنوان اول این مسابقه را کسب کرد. مسابقه نیمه نهایی یک(لینک سوالات) سوال B - علی کوچولو و کلمات متقارن : راه حل داور دارای مرتبه ی زمانی متناسب با مجموع طول کلمات بود. سوال C - تجزیه ی گراف ها : تبدیل می شود به مساله ی 2SAT . تنها یک نفر موفق شد این مساله را سر مسابقه حل کند (مهدی صفرنژاد) ولی حداقل دو نفر دیگر به ایده ی این سوال رسیده بودند ولی از آن جایی که بلد نبودند کد 2SAT را بنویسند، موفق به حل آن نشدند. ظاهرا محمدرضا خانی راه حل دیگری برای این سوال داشت، که به علت خستگی، از او خواستم بعدا توضیح دهد! سوال F - یافتن زیر درخت : بیش از یک راه حل با مرتبه ی زمانی خطی برای حل این مساله وجود دارد. جمع بندی : این مسابقه راضی کننده تر از مسابقه ی قبلی بود، و تقریبا هیچ مشکل خاصی پیش نیامد. در انتها مهدی صفر نژاد با حل 5 سوال نفر اول این مسابقه شد. مسابقه ی نهایی(لینک سوالات) سوال A - شمارش درخت های پوشا : این مساله را می توان با استفاده از قضیه ی Matrix-Tree حل کرد. ولی از آن جایی که اصولا نباید انتظار داشته باشیم شرکت کننده ها چنین قضایایی را بلد باشند، من خودم این مساله را با استفاده از یک الگوریتم برنامه سازی پویای (O(n^2 3^n حل کرده بودم. سر مسابقه سه نفر این مساله را حل کردند که دو نفر از قضیه ی مذکور استفاده کردند، و یک نفر از راه حل برنامه سازی پویا (نمی دانم راه حلش شبیه مال من بود یا نه). سوال B - کوچک ترین مثلث : با راه حل (O(n^3 ای که خوب پیاده سازی شده باشد حل می شود، ولی احتمالا راه حل های بهتری نیز وجود دارند! سوال C - رشته های امن : برنامه سازی پویا با استفاده از آرایه ی overlap الگوریتم KMP! سوال D - مسافرت های تصادفی : راه حل من یک DFS بود، ولی ظاهرا اکثر شرکت کنندگان از راه حل دیگری استفاده کردند. سوال E - انتخاب پروژه ها : تبدیل می شود به مساله ی مشهور Minimum Cut در گراف. تنها یک نفر (نیما احمدی پور) موفق به حل این مساله شد، ولی حداقل یک نفر دیگر ایده ی درست برای حل این مساله را داشت (مهدی صفرنژاد)، که متاسفانه راه حلش جواب درست را نمی داد. سوال F - پارادوکس : راه حل این مساله ترکیبی است از پیدا کردن مولفه های همبند، Brute Force، و برنامه سازی پویا. باز هم تنها یک نفر موفق به حل این مساله شد (نیما احمدی پور) ولی راه حل مهدی صفرنژاد هم اکثر تست ها را درست جواب می داد و تنها در چندین تست با پاسخ داور تفاوت داشت. سوال G - طولانی ترین زیردنباله ی مشترک : برنامه سازی پویا. نکته ی اساسی این مساله این بود که هر عدد حداکثر یک بار در هر دنباله وجود دارد. چندین نفر تلاش کردند که از چندین LCS دو به دو استفاده کنند که مسلما راه حل درستی نیست و با کمی تامل می توان مثال نقضی برای آن پیدا کرد. جمع بندی : از آن جایی که مشکل خاصی وجود نداشت، و شرک کنندگان هم از سطح و نوع سوالات راضی بودند، مسابقه ی خوبی بود، و باعث شد که مسابقات به خوشی برای من تمام شود. در انتها نیز نیما احمدی پور با حل 8 سوال مقام اول را کسب کرد.
(Page 1 of 1, totaling 4 entries)
|
Me
Me = { "Name": "Hadi", "Job": "Programmer", "Hobbies": [ "Thinking", "Reading", "Walking", "Living" ], ... } Favorite LinksCategoriesSyndicate This BlogBlog AdministrationWeblog Statistics |
