شاززز

شما در حال مشاهده بلاگ قدیمی شاززز هستین! سایت جدید به آدرس shaazzz.ir در دسترسه.
شاززز

اینجا وبسایت آزاد المپیاد کامپیوتره! ;)
واسه ی همه ی سطوح از تازه کارها تا طلای جهانی!

طبقه بندی موضوعی
بایگانی

۵ مطلب در ارديبهشت ۱۳۸۵ ثبت شده است

۲۴
ارديبهشت

سلام خوبین؟

خوب مرحله 2 هم تموم شد رفت!قبل مرحله 2 (و بطّبع کمی بعدش) همونطور که گفته بودیم وبلاگ ما کاملنرنگ و بوی مرحله 2 گرفته بود. مسه شما ها دیگه. ولی خوب الان دیگه خیلی چیزا فرق میکنه

اونایی که اوّلی ان به جز سوال حل کردن، بد نیست که شروع کنن یه کمی الگوریتم یاد بگیرن.مثلن فصله 4 کتاب کریتیو(Creative) خیلی خوبه واسه این کار! از الگوریتم های استقرا ایی خیلی ساده شروعکرده. دوّمی ها هم خوبه حدّه اقل فصل 4 کریتیو رو بخونن!

(از این بگزریم که هر گونه اطَلاعاتی که قراره نیاز داشته باشین،  تو دوره تابستون درس داده میشه) فصل هایه دیگه از کریتیو هم بد نیست، خوبه! به نظره من که تا فصل 7 اشو بخونین...(با اینکه تو دوره اکثرشو درس خواهند داد، ولی خوب این کار 2 تا خوبی داره! یکی اینکهمساله هایه کریتیو مساله هایه خوبی ان و به آدم دید الگوریتمی میدن(و بعضی هاشونم سختن!!!) خوبیه دومش اینه که وقتی تو دوره دارن اینا رو درس میدنشما(ایشالا که همتون قبول شین!) میگیرین راحت سر کلاس میخوابین!)

بگزریم

به جز کریتیو ، بد نیست سوال هایه دوره هایه سال هایه پیش رو گیر بیارین و حلشون کنین دیگه! اوضاع داره قرو قاتی میشه! بزارین دقیق تر به قضیه نگاه کنیمD:

تو دوره یه سری امتحان تئوری برگزار میشه و یه سری امتحان درسی. امتحان های تئوری رو که باید زور بزنین هلشون کنین دیگه (گفتم که سوالهای سالهای پیش رو پیدا کنین حل کنین، کلّن سوال حل کنین دیگه...)

امتحان های درسی اینان:گراف، الگوریتم، ترکیبیات

اینو بگم که امتحان های درسی معمولن ساده ان(معمولن)

برای درس گرافتون میتونین کتاب آشنایی با نظریه گراف(وست) رو بخونین

خوبیه این کتاب مساله هایه جالبشه! حل کردنه مساله هاش باعث میشه دید خوبی پیدا کنین کلّن!(مساله حل کردنتون به دنبالش قوی میشه)

واسه درسه الگوریتم که کریتیو رو گفتم...

ترکیبیات هم درگیرش نشین بهتره ! همون تو دوره میان یه سری شرّو ور درس میدن بهتون (بستگی به معلّمش داره که چی درس بدن) و اصلن کلّن صحبت نمیکنیم اینجا در مورده ترکیبیات! فمیدین؟

اینا که قسمته تئوری قضیه بود، کلّن تو دوره تابستون درصد امتحان هایه تئوری خیلی بیشتر از عملی هست.(پارسال توری 90 درصد بود! و عملی فقط 10 درصد!!!) ظاهرن همیشه قراره اینجوری باشه...

تو دوره خودشون ++C (زبونی که قراره باهاش برنامه بنویسین)یاد میدن. البتّه بد نیست اگه خودتون از قبل بلد باشین و تمرین کرده باشین.بازم میگم : خوب دقت کنین که تو دوره پارسال عملی فقط 10 درصد تأثیر داشت!

برای تمرین کردن عملی هم میتونین برین تو این سایت هایی که ما لینکشو گزاشتیم اون گوشه!بهترینشون واسه شروع به نظره من همون USACO هست!

خوب دیگه، سرم درد گرفت!

خوش باشین.  قبله اینکه برم دوست دارم از یکی از دوستایه عزیزم که الان داره تو دانشگاه تورنتو درس میخونه و 2 تا مدال نقره کشوری داره یه چیزی بگم:

المپیاد فقط یه پوئنه!  واسه اینکه یه سری کار ها رو راحت تر کنه، فقط همین!و هر چیزی که ما فکر میکنیم از المپیاد خوندن به دست میاد، میشه بدونه اینکه هیچ ربطی به قضیه المپیاد پیدا کنه، به دست اورد...

موفق باشین دوستان

یا حق

  • شااززز منگولیا
۱۷
ارديبهشت
۱) اون‌هایی که f_0=0 هست که تابلوئه آینه‌ای هستن. چون اگه f_1=a باشه اونوقت دنبالمون میشه عین فیبوناچی که فقط هر عدد ضریب a گرفته. که میشه اینو با استقرا یا کلی چیز دیگه اثبات کرد.
بقیه‌ی دنباله‌ها رو میشه فرض کرد که f_0 همه بیشتر از صفره, چون اگه اینجوری نباشه کافیه همه‌ی دنباله رو در ۱- ضرب کرد و رابطه‌ی آینه‌ای بودن یا نبودن همچنان برقرار میماند. حالا خود اینها میشن دو دسته:
دسته‌ی اول: اون‌هایی هستن که f_1 کمتر از صفره. برای این‌ها کافیه f_1 و f_-1 رو در نظر بگیرید و به تناقض برسونید.
دسته‌ی دوم: اونهایی که f_1 بزرگتر از صفره. برای این‌ها کافیه اولین i رو در نظر بگیرید که منفی شده. باز دو حالت پیش میاد:
اولین i بعد از ۱ و -۱ باشه: اگه فرمولش رو بنویسید میبینید که مجبور میشه دنباله شامل یکدونه صفر باشه. و ما چند خط بالاتر ثابت کردیم که با شروع از ۰ به یک دنباله‌ی آینه‌ای میرسیم که البته نسبت به جایگاه ۰ آینه‌ای هستن. برای همین دنباله‌ی ما از f_0 نمیتونه آینه‌ای بشه.
اولین i خود ۱ و -۱ باشه: که در این صورت اگه فرمول رو بنویسید می‌رسید به f_1= - f_-1 که نتیچه میده i=2*j و با استقرا ثابت میشه که این هم حالتی از جوابه.

و اینجوری ثابت میشه دنباله‌هایی که یا f_0=0 با f_1=2*f_j هست جواب مسئله است.

۲) این جور سوال‌ها که بر میگردن به روابط بازگشتی بهشون میگن dynamic. مثلا توی این سوال وقتی می‌خوایم c_i,j رو حساب کنیم, باید ببینیم که چطور مسئله‌ی حل از i تا j رو به حل یه تعداد r تا k تبدیل کنیم. البته باید همیشه توجه کنید که توی دور نیفتیم, یعنی از حل i,j دوباره نرسیم به خود i,j. البته در این سوال‌ها یک سری حالت اولیه هم در نظر گرفته میشه که جوابشون بدیهی تلقی میشه, مثلا در این سوال c_i,i صفر در نظر گرفته میشه. در این سوال هم کافیه توجه کنیم که در حالت بهینه برای حل i,j ما آخرین حرکتمان جوش دادن دو تکه میله هست که یکی شامل میله‌های از i تا k هست و اون یکی شامل از k تا j که k میتونه از i+1 تا j-1 باشه. پس c_i,j مساوی خواهد بود با مینیمم
c_i,k + c_k+1,j + w_i,k + w_k+1,j
که در اون k از i+1 تا j-1 هست و w_x,y هم به معنای جمع وزن میله‌های از x تا y هست.
برای حساب کردن c_1,n هم کافیه یه جدولn*n بکشید که در اون درایه‌ی x,y نشون‌دهنده‌ی c_x,y باشه و حالا اول همه‌ی اونهایی رو بدست بیارید که y-x=1 هست. بعد اون‌هایی که y-x=2 هست, همیونجور ادامه بدید تا اون‌هایی که مساوی n هست.

۳) بیاید برای هر شهر یک تابع f در نظر بگیرید که f شهر a میشه اون مجاوریش که اگه جاده‌ی بین a و اون مجاور رو حذف کنیم, زیر کشور اون مجاوره بیشتر از 2n/3 بشه. واضحه که f یه نفر بیشتر از یه شهر نیست. حالا سوال اینه که آیا شهری هست که f نداشته باشه؟ (چون اگه همه‌ی رئوس f داشته باشند که بدیهیه مسئله جواب نداره و اگه یه راس بدون f پیدا بشه, کافیه که اون یالی رو حذف کنیم که زیر کشور تشکیل شده‌ی دارای مجاورش ماکزیمم راس را داشته باشد)
خوب حالا برهان خلف می‌زنیم, اگه همه f داشته باشند, کافیه یه راس a رو در نظر بگیریم. حالا میریم سراغ f_a و بعد سراغ f_f_a و همینطور ادامه میدیم و هر دفعه میریم به f راسی که داخلش هستیم. این مثل حرکت روی جاده‌ها میمونه. ار اونجایی که توی جاده‌هامون دور نداریم(بین هر دو شهر دقیقا یک مسیر وجود داره) و تعداد راس‌ها هم متناهیه, پس یه زمانی از جاده‌ای که اومدیم دوباره برمی‌گردیم. خوب این یعنی هر ور جاده 2n/3 شهر داره که تناقضه


این یه روش استقرا داره که میگه اگه طی مراحلمون به n(طول جایگشت) رسیدیم که در مرحله‌ی بعدی n به اول جایگشت میاد و ازگردونه حذف میشه و بقیه هم طبق استقرا حل میشند. و اگه هم هیچوقت n نیاد که خوب مسلما هیچ‌وقت عددی که در اول جایگشت هست هم استفاده نخواهد شد برای همین هیچ عیبی نداره اگه جای n رو با اون عدده عوض شده فرض کنیم. و حالا هم با استقرا باز به نقره‌ای خواهیم رسید.
این سوال یه روش با حال هم داره که میاد میگه به هر حایگشت یک عدد در مبنای ۲ میدیم. اینجوری که اگر عدد سمت راست ۱ بود, بیت سمت راست رو میذاریم ۱ وگرنه ۰. برای بقیه هم همینطور, اگه نفر i ام از سمت راست جایگشت برابر با i بود, بیت i ام از راست ۱ وگرنه ۰ است. حالا نکته اینجان که با یک عملیات روی جایگشت اگر نفر سمت راست ۱ بوده باشد که عدد ما هیچ تغییری نمی‌کند وگرنه عددمان بزرگ می‌شود(خودتان اثبات کنید) و چون عددمان از ۲ به توان n نمیتواند بیشتر شود لذا زمانی محبور است به جایگشت نقره‌ای برسد.

۵)خب این با قضیه‌ی هال که بدیهیه. بدونه اون هم با استقرا میشه گفت. اون جعبه‌ای که یدونه داره که واضحه باید از اون جعبه همون مهرهه انتخاب بشه, حالا فرض کنید اسم اون جعبه a باشه و مهره‌ی داخل اون b باشه. حالا که ما b رو انتخاب کردیم, باید ببینیم که کدوم جعبه b داشته(اگه هیچ کس دیگه‌ای نباشه که خوب رسیدیم به حالتی که از همه دقیقا ۲ تا داریم و با روشی شبیه به همین حله.) میایم اون جعبه‌ای که b رو داشت در نظر میگیریم و فرض میکنیم که b از توش حذف شده. حالا مثل اینه که رسیده باشیم به حالت فرض استقرا و همینطور ادامه میدیم تا تموم بشه.
  • شااززز منگولیا
۱۴
ارديبهشت
۵) این بصورت استقرایی ثابت میشه. یعنی مسلما فرد ۱ باید دره یک رو باز کنه. بعد نغر ۲ باید کار انجام بده. بعد ۳ باید انحام بده, بعد ۴ نباید انحام بده و همینطور فرض میکنیم که تا نفر k همه بصورت یکتا تعیین میشن. حالا بسته به اینکه در صندوق k باز باشه یا بسته, نفر k هم یکتا تعیین میشه(توجه کنید که غیر از k کس دیگری نمانده که بتونه صندوق k رو تغییر بده)

۶) این روشی که گغته برای یه خونه عددش میشه فلان, مثل اینه که عدد هر خونه بشه جمع همه‌ی اعداد سطرش بعلاوه‌ی جمع همه‌ی اعداد ستونش.(توجه کنید که جمع در Z2 میشه همون xor هست). که البته چون خودش دوبار حساب میشه, خودش تاثیر نداره. حالا فرض کنید به جدول داریم که جمع اعداد ستون i میشه a و جمع اعداد ستون j میشه b. (توجه کنید که a و b یا ۰ یا ۱ هستن) عدد سطر k ام ستون i می شه جمع اعداد سطر k و a. عدد سطر k ام ستون j می شه جمع اعداد سطر k و b. حالا اگر a=b بود این دو عدد مساوی وگرنه مخالف همدیگه می شند. پس اگه یه جدول اصلاحپذیر باشه اعداد ستون i ام یا همه مساوی یا همه مخالف اعداد ستون j ام هستند. (همچنین برای سطرها) حالا میخوایم ثابت کنیم جمع اعداد هر ستون مساویه. فرض کنید ستون i بشه a. اونهایی که مساویه ستونه‌هن که هیچ. اونهایی که مخالفه‌شن جمعشون میشه (n-a) که چون n زوجه (n-a) هم میشه همون a. پس جمع اعداد همه‌ی ستون‌ها یکسانه(و سطرها هم یکسانه). خوب حالا که جمعشون یکسانه برگردیم به ۴-۵ خط بالاتر. نتیجه میگیریم که همه‌ی ستون‌ها با هم مساویند(و همه‌ی سطرها هم). چون همه‌ی ستون‌ها مثل همند اگر خانه‌ی (i,j) یک باشه اونوقت سطر i و در نتیجه همه‌ی سطور ۱ میشوند. پس یا همه‌ی اعداد ۱‍ هستند و یا همه ۰. اگه همه ۰ باشند که خوب مستقیما مرحله‌ی بعدی به خودمون میرسیم. اما اگه همه ۱ باشند مرحله‌ی بعد به همه ۰ میرسیم و هیچوقت دیگه به همه ۱ نمیرسیم. پس جواب سؤال میشه تنها یک جدول و اون هم همه ۰.

۷) این سؤالیه که مسلما چندین راه داره ولی یه راهه خیلی آسون و کوتاهش اینه: بیاین ۲نفر ۲نفر دسته بندیشون کنید(نفر ۱۳۸۵ تنها میمونه). حالا نفر اول هر دسته میاد رنگ کلاه نفر دوم رو مینویسه و نفر دوم هم معکوس رنگ نفر اول رو مینویسه. اینجوری اگه رنگشون برابر بوده, نفر اول وگرنه اگه مخالف باشه نفر دوم درست گفته. اینجوری نزدیک به ۵۰٪ افراد درست خواهند گفت.

۸) از طرز سوال بدیهیه که با خیابان‌های موازی محورها نمیشه و با مورب‌ها میشه.
اینکه چرا موازی‌ها نمیشن: فرض کنید اگه مثلا خونه‌ی شهردار سمت راست یه خیابان عمودی باشه و اول کار به سمت پایین بره (بقیه هم به همین صورته), اونوقت همیشه یا سمت راست خیابان‌های عمودیه یا سمت بالای خیابان‌های افقیه. و برای همین همیشه یا داره به سمت پایین میاد یا به سمت چپ و هرگز به خودش نمیرسه. البته این رو میشه با استقرا روی تعداد چهارراه‌های رفته اثبات کرد.
اینکه جرا مورب‌ها میشه: میشه با ۳ جاده حرکت پیچش به راست رو شبیه‌سازی کرد. یعنی در سمت راست یک جاده حرکت کنی و به سمت راست بپیچی ولی همچنان در سمت راست جاده بمانی. حالا که این حرکت رو داریم خیلی راحت میتونیم دور بزنیم و به خودمون برسیم.
  • شااززز منگولیا
۱۳
ارديبهشت
۱) الف) با خودتون ب) تابلویه که جواب بصورت مجموعی از اعدادمون هستن که هر کی ضریب -۱ یا ۱ داره. البته حتما یه نفر با ضریب مثبت وجود داره(با استقرا تابلوئه). پس جواب بصورت (جمع چند تا) منهای (جمع بقیه) هست. حالا ما جواب مینیمم رو در نظر میگیریم. میایم اول قسمت مثبت رو جمع می‌زنیم و بعد قسمت منفی رو جمع میزنیم و آخر این دو عدد رو از هم کم می‌کنیم.

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

۳) اول همه‌ی لامپ‌ها رو رندوم میبندیم به کلیدها. حالا دو حالت پیش میاد:
الف) یدونه لامپ روشن بشه: که بدیهیه: با ۱۰۰ حرکت خرابها رو درمیاریم و هر کلیدی رو با لامپ سالمه چک میکنیم اگر روشن شد که میفهمیم کلید درسته و لامپه نظیرش خراب بوده. اگر هم روشن نشه فقط میفهمیم که کلید خرابه. از این دومی ۵۰ بار اتفاق میفته که لامپ‌های نظیرشونرو میتونیم با اون کلید درسته چک کنیم و حله.
ب)هیچکی روشن نشه: که خوب ‍پس یار هر کس دقیقا برعکسه خودش بوده. پس ۵۰ تای اول رو در خودشون یکی شیفت میدیم جلو(یعنی ۱ به ۲, ۲ به ۳, ... , تا ۵۰ به ۱). اگه کسی روشن نشد که تابلویه وگرنه یه دونه روشن میشه. حالا بوسیله‌ی این و شبیه به بالا حل میکنیم البته توجه داشته باشید که با تعیین هرکس وضعیت اون یار قبلیش هم معلوم میشه.
اینکه چرا میشه ۲۵۰ تا حداکثر, خودتون چک کنید.

۴) سوال هم ارزه با اینکه بگیم: دو رشته اگر حداکثر در ۲ بیت تفاوت داشته باشند باید کد متفاوتی براشون خرج بشه. که این اگر کدمون حداکثر k باشه غیر ممکن و اگر k+1 باشه حتما ممکنه. که مسئله مورد اول رو می‌خواد. کافیه بیاین یدونه رشته رو با همه‌ی کسانی که باهاش تو یه بیت تفاوت دارند رو در نظر بگیرید. این دو به توان k بعلاوه‌ی ۱ رشته میشه. که چون با k بیت کد حداکثر دو به توان k حالت میشه پوشوند لذا دو تا از این رشته‌ها کد یکسان دارند و نمیتوان بینشان تفاوت گذاشت.(در حقیقت نمی‌فهمیم که کدامیک از این‌ها منظور فرستنده بودند.)

اینها هم تقریبا حل-راهنمایی بودند و مقداریش رو باید خودتون ثابت کنید.
  • شااززز منگولیا
۰۱
ارديبهشت
جواب 1) کافیه ثابت کنید که از هر ستون لازم و کافیه که تنها آخرین دستور sort اون ستون اجرا بشه. لازمش که بدیهیه چون کافیه سطرها همه‌ی اعدادشون مساوی باشند و فقط در همین یه ستون با هم فرق کنند. کافیش هم تقریبا واضحه چون کلا دستوراتی که قبل از دستور sort_i میان، بود و نبودشون فقط در جابجایی افرادی مهم هست که عضو iامشون با هم یکسانه که خوب یه دستور sort_i دیگه، تغییری در اونها ایجاد نمیکنه.

جواب 2) داریم استقرا میزنیم روی n. اگه یکی از بازه‌ها کاملا در یکی دیگه قرار داشته باشه، کافیه اون بزرگه رو حذف کنیم و سپس بنابر استقرا اون k-1 نقطه‌ی مناسب رو انتخاب کنیم. حالا چون یکی از نقاط داخل کوچیکه هست، پس از بزرگه هم یکی انتخاب شده و تموم. حالا فرض کنیم حالتی هست که هیچ بازه‌ای کاملا داخل دیگری نیست. میایم همه نقاط شروع بازه‌ها رو مرتب میکنیم. حالا زودترین شروع رو در نظر بگیرید. بیاید نقطه‌ی انتهای این بازه رو بعنوان یکی از نقاط انتخابیمون در نظر بگیرید. چون همه‌ی بازه‌هایی که بین شروع و پایان این بازه، باز شدن، بعد از پایان این بازه، بسته شده‌اند(وگرنه کاملا داخله بازه‌ی انتخابیه ما میومده)؛ لذا با انتخاب این نقطه‌ی خاص، از همه‌ی بازه‌هایی که قبل از بسته شدن اولین بازه، باز شده‌اند، یک نقطه انتخاب شده. پس حالا همین کار را ادامه میدهیم. یعنی باز اولین بازه‌ای رو در نظر میگیریم که بعد از تمام شدن اولی، شروع شده. و نقطه‌ی انتهایش را بعنوان یکی دیگر از نقاط انتخابی در نظر میگریم. و همینطور ادامه می‌دهیم. واضحه که همه‌ی بازه‌ها حداقل یک نقطه‌یشان انتخاب شده. حالا میمونه ثابت کنم تعداد نقاط حداکثر k-1 هست. این هم واضحه‌ چون بازه‌هایی که ما نقاط انتهایشان رو انتخاب کرده بودیم، کاملا جدا از هم هستند، لذا اگر تعداد این بازه‌ها بیشتر از k-1 باشد، اونوقت توانسته بودیم که k تا بازه در نظر بگیریم که با هم هیچ اشتراکی ندارند و این با فرض مسئله در تناقضه.

جواب 3) یه گراف جهت‌دار وزندار می‌سازیم. اینطوری که به ازای هر حالت از چینش کتاب‌ها(حداکثر میشه دو به توان n در n فاکتوریل) یک راس میذاریم. و از راس a یک یال جهت‌دار به b با وزن i میذاریم اگر بوسیله‌ی swap_to_i بشه از حالت a به b رسید. توجه کنید که این گراف به ازای هر یال از a به b یک یال با همون وزن از b به a داره.(در حقیقت یه جورایی این رو میشه بصورت گراف بدون جهت دیدش ولی برای اثبات راحت‌تر اینجوری در نظر میگیریمش). حالا اعمال ما مثل طی کردن یک گشت توی این گراف میمونه. چون تعداد یال‌ها متناهیه زمانی ما از یک یال مجددا عبور خواهیم کرد(همینجا جهت‌دار بودنش کار رو راحت میکنه). پس یال e اولین یالی هست -مثلا با وزن i- که پس از طی چند عمل دوباره به خودش میرسه. بدیهیه که نه تنها e بلکه همه‌ی یالهای توی گذر بسته‌ی از e به e همینجوری هستن و چون یه یال توی این گذر هست که وزنش یکه(کافیه اینقدر طبق الگوریتم حرکت کنیم تا برسیم به 1 دیگه). فرض کنیم این یال 1 که بوسیله‌ی حرکات الگوریتممون توی یک گذر بستن، از a به b باشه. پس ما از a با شروع از یال 1 و طی چند حرکت میرسیم به خودش. این دقیقن مثل وقتی هست که ما از حالت اولیمون شروع کردیم به حرکت. نکته اینجان که ما اگه از راس فلان طی چند حرکت به خودش برسیم، از هر راس دیگه‌ای هم اون حرکات خاص رو انجام بدیم باز به خوده اون راسه میرسیم. بعبارت واضح‌تر حرکات ما مستقل از وضعیت کتابا هستن. لذا اگه یه راس بتونه با شروع از 1 برسه به خودش(که راس a الآن اینجوریه) راس شروع ما هم باید براش همین اتفاق بیفته.

خوب اینم از حل سوالا. کلی واستون مرام گذاشتما. آخه بجای اینکه برم بازی کنم دارم واسه شما چرت و پرت تایپ میکنم. البته اگه اینجوری که من نوشتم توی امتحان بنویسید 0.0000000001 هم نمیشید. من تقریبا بعنوان یه راهنمایی-حل نوشتمش.

  • شااززز منگولیا