Wednesday, October 12, 2022

GTC Open October Part II

 10A - Урвууг тоолох

f(n, k)-гаар k урвуу хостой n сэлгэмэлийн тоог тэмдэглэе.

1-ээр эхэлсэн сэлгэмэлийн k урвуу хостой сэлгэмэлийн тоо f(n-1, k). Яагаад?

Харин 1 гэсэн тоо сэлгэмэлийн эхнээсээ 2 дахь байрлалд орвол f(n-1, k-1) байна. Яагаад гэхээр 2 дахь байрлалд орох болгондоо хос үүсгэнэ гэсэн үг.

За үүнтэй ижил 1 гэсэн тоо 3, 4.. гээд байрлаад явбал бодлогын хариу яаж нэмэгдэх вэ гэдэгийг хараарай. Тэгэхээр ерөнхий тохиолдолд:

f(n, k) = sum(f(n-1, k-i)) for (0<=i<n) болно.

Дээрх томъёогоор бодвол бодолт O(N^2 * K) болно. Хугацааны хязгаарлалт хэтрэх нь ойлгомжтой.

Томъёогоо эмхэтгээд үзвэл f(n, k) = f(n, k-1) + f(n-1, k) - f(n-1, k-1) болж бодолт O(N*K). Санах ойгоо хэмнэх үүднээс заавал n*k*sizeof(int) авч явах хэрэг байна уу? f(n-1, k), f(n, k)-г хадгалаад явчихаж бас болно.

Бодолт


10D - Graph

Энэ бодлого бол Articulation Point-той холбоотой бодлого.

За би уг нь Таржаны алгоритмыг энэ пост дээрээ тайлбарлая гэж бодож энэ удаагийн тэмцээний анализыг 2 хэсэгтэй болгосон юм. Даанч ажил ерөөсөө болж өгөхгүй завгүй байгаа тул таржаны алгоритм тайлбарлахыг дараа болоё. Бодолтруугаа шууд ороё, уг нь их амархан.

Аль нэг оройгоос гүний нэвтрэлт хийгээд гүний нэвтрэлтийн модоо үүсгэе

1 дугаартай хүсэлтийн хувьд:

a, b, c, d гэж үзье. Мөн гүний нэвтрэлтийн модны хувьд d орой нь c оройн доор байрлаж байгаа гэж үзье. Үнэндээ бидэнд d орой хамгийн чухал. d орой articulation point биш буюу ямар нэгэн циклд агуулагдсан бол c-d ирмэгийг устгахад a->b очиж чадах нь ойлгомжтой. d орой харин articulation point бол бид a болон b орой d оройн доор хоюул оршиж байна уу эсвэл дээр хоюул оршиж байна уу гэдэгийг шалгах хэрэгтэй.

2 дугаартайг ч гэсэн графын хаана байрлаж байгаагаас шалтгаалаад тооцоолчихно, кодноос дэлгэрэнгүй хараарай. Асууж тодруулах зүйл байвал коммент үлдээгээрэй, дуртай бас шуурхай хариулах болно оо

Бодолт


Sunday, October 9, 2022

GTC Open October

 Хоёр дахь тэмцээн маань амжилтттай болж өнгөрлөө. Тэмцээнд нийт 29 хүн бүртгүүлж 13 оролцогч оролцлоо. Цаг заваа зохицуулан хэрэг гаргаж оролцсон оролцогч нартаа их баярлалаа.

Ингээд эхний 3-н байр:

1-р байранд _mrsn_ 340 оноотой

2-р байранд MazaalaiMNGL 330 оноотой

3-р байранд Turkhuu 330 оноотой 

тэмцээнийг тэргүүллээ. Дээрх оролцогч нар тэмцээний facebook хуудсаар холбогдож шагналаа авна уу.


Бодлогын анализдаа ороё.

10B - Zoom

Энэ удаагийн тэмцээний хамгийн амархан бодлого. Шууд симулац хийгээд хэвлэчихэж болно эсвэл жижигхэн мат ашиглаад шинээр үүсэх текстийн (i, j) дэх тэмдэгт нь хуучин текстийн (i/zr, j/zc)дэх тэмдэгт гэдэгийг харчихвал арай бага код бичиж болох юм.

Бодолт

10C - Count

Зөв хаалт зохион байгуулах бодлого. Иймэрхүү бодлого ихэвчлэн рекурс буюу стэк өгөгдөлийн бүтэцээр шийдэгддэг.

Шууд хүчээр шалгаад бодвол квадрат бодолт үүсэж хугацааны хязгаарлалт хэтэрсэн алдаа авна.

Эхлээд бодлогоо дараалалд байгаа бүх хүн ялгаатай өндөртэй үед бодоё.

Бодлогын өгүүлбэрээс ажиглавал А гэсэн хүн өөрөөс нь хойно зогсож байгаа хүмүүсээс хамгийн эхний өөрөөс нь эрс өндөр Б гэсэн хүнээс хойно зогсож байгаа хүмүүсийг харахгүй нь тодорхой буюу А-н хувьд Б-ээс хойно зогсох хүмүүс хамаагүй болж байгаа юм: Тэгэхээр яг ийм А Б гэсэн интервалыг дэд дараалал гэж үзье.

Хүмүүсийг зогсож буй дарааллаар нь 1, 1-ээр нь шалгаад явая. Дэд дараалалд шинээр орж ирэх хүн дандаа хамгийн хойно зогсож байгаа хүнээс намхан эсвэл ижил өндөртэй хүн байх нь ойлгомжтой. Мөн дэд дараалалд хүн шаардлага хангаад нэмж орж ирэх болгонд бодлогын хариу 1-ээр нэмэгдэнэ. Яагаад гэвэл хөрш хүмүүс бүгд бие биенээ харах учир.

Одоо дэд дараалалд маань хамгийн хойно зогсож байгаа хүнээс өндөр хүн ороод ирэхэд яах вэ? тэгвэл бид дахиад шинэ дэд дараалал үүсгэнэ. Ингэхдээ, өмнөх дэд дараалалд байгаа хүмүүсээс хамгийн хойно зогсох гэхдээ шинэ орж ирж байгаа хүнээс өндөр, тэр хүний хойно энэ шинэ хүн зогсож дахин дэд шинэ дараалал үүснэ. Тэгэхээр хэрэв дэд дараалалын хойно байгаа хүн шинэ хүнээс намхан бол хасаад явна, ингэх тоолонд бодлогын хариу бас 1-ээр нэмэгдэнэ. Яагаад гэвэл энэ шинэ хүнийг эдгээр хасагдаж байгаа хүмүүс бүгд харж чадах ёстой, яагаад гэхээд манай дэд дараалал угийн буурахаар эрэмбэлэгдсэн байгаа.

Дээрэх алгоритмыг стек ашиглаж дэд дараалалд хүн нэмэх болон хүн хасах үйлдлийг O(1)т хийж чадвал шугаман бодолт болно.

Одоо, дарааллаж зогсож буй хүмүүс ижил өндөртэй үед яах вэ? Ер нь ижил өндөртэй үед дээрх алгоритмаар бодвол яагаад болохгүй вэ? Үнэндээ дарааллаж зогсож буй хүмүүс ижил өндөртэй л биш бол бүх хүмүүсийн өндөр ялгаатай байх нь чухал биш, яагаад?

Бодолт

Part II-р дараагийн 2 бодлогын анализыг хийе