
Арай л удаан уу ???

М.Мөнхбагана
Багш


М.Мөнхбагана
Багш
Өрсөлдөөнт программчлал бол зүгээр нэг код бичих бус, хурд, нарийвчлал, оновчтой сэтгэлгээний бодит тулаан юм.
Үүнтэй зэрэгцэн программист бүрийн хувьд секунд бүр алт шиг үнэтэй байдаг.
Тиймээс олон туршлагатай программистууд алдааны магадлалыг бууруулах, код бичих хугацааг хэмнэх зорилгоор урьдчилан бэлдсэн, олон дахин ашиглах боломжтой “template” буюу эх загвар ашигладаг. Энэхүү нийтлэлээр бид өрсөлдөөнт орчинд хамгийн өргөн хэрэглэгддэг, хурд, хялбар байдал, уян хатан байдлыг хослуулсан сонгодог C++ template-ийг танилцуулж, түүний бүрдэл хэсгүүдийг алхам алхмаар задлан ойлгох болно.
Энэ нь C++ стандарт сангуудыг бүгдийг нь нэг дор агуулж авдаг тусгай header файл юм. Үүний ачаар та iostream, vector, algorithm, string гэх мэт олон header файлуудыг тус тусад нь бичихгүйгээр шууд ашиглах боломжтой.
Анхаарах зүйл: Энэ header-г зөвхөн өрсөлдөөнт программ бичих үед (competitive programming) ашиглахыг зөвлөдөг, томоохон төсөлд биш.
std нэрийн сангийн элементүүдийг шууд ашиглах боломжоор хангана. Жишээ нь std::cout биш cout гэж бичнэ гэсэн үг.
Программын гол шийдэл буюу бодлогын алгоритм байрлах функц юм. Одоогоор хоосон, гэхдээ өрсөлдөөнт програмчлалын үед олон даалгаврыг нэг кодонд шийдэхэд тус бүрт нь solve() гэж нэрлэсэн функц ашиглана.
int32_t гэж тодорхойлсон нь int-тэй бараг адилхан (ихэвчлэн 32-битийн int), кодын уншигдах байдлыг сайжруулах зорилготой. Үндсэндээ int main() гэж бичсэнтэй адил.
Зорилго: Программыг шалгахдаа гараар консолоор оролт гаралт хийхгүйгээр файл ашиглан туршихад хялбар.
#ifndef ONLINE_JUDGE — хэрэв ONLINE_JUDGE гэж тодорхойлсон биш бол гэсэн утгатай.
Ихэвчлэн онлайн өрсөлдөөнт системүүд (Codeforces, AtCoder, SPOJ гэх мэт) орчныг автоматаар ONLINE_JUDGE macro-оор тэмдэглэдэг.
Тэгэхээр энэ хэсэг код нь зөвхөн таны локал машин дээр ажиллах үед идэвхтэй болно.
freopen("input.txt", "r", stdin);
Стандарт оролтыг (консолоор оруулж авдаг өгөгдөл) input.txt файл руу чиглүүлж байна.
freopen("output.txt", "w", stdout);
Стандарт гаралтыг (консолоор хэвлэх үр дүн) output.txt файл руу чиглүүлнэ.
Эдгээр тохиргоо нь оролт гаралтын хурдыг ихээхэн нэмэгдүүлдэг тул өрсөлдөөнт программд ашиглагддаг.
ios_base::sync_with_stdio(0);
cin болон cout-г C хэлний scanf/printf-тэй синхрончлохоо болиулна. Ингэснээр оролт гаралт хурдан болно.
cin.tie(0);
cin болон cout-ийн холболтыг салгана. Ер нь cin-ээс оролт авах үед cout-ийг автоматаар гүйцэтгэдэг байдлыг таслана.
cout.tie(0);
Ижил утгатай, ер нь cout-г өөр зүйлд бэхлэхгүй.
t нь хэр олон тест (асуулт) шийдэхийг заана.
Одоогоор 1 гэж өгсөн ба cin >> t; шугам нь сэтгэгдэлд оруулсан тул хэрэглэгдэхгүй байна.
Хэрвээ олон тест орж ирвэл коммент тайлбарлахад хангалттай.
Давталтаар solve() функцыг нэг удаа дуудаж байна.
Энэ код нь өрсөлдөөнт програмчлалын үндсэн загвар (template) юм.
Тухайн бодлогын гол шийдэл нь solve() функцэд бичигдэнэ.
Локал тест хийхдээ оролт гаралтыг файлаас уншиж, файл руу бичдэг тохиргоо оруулсан.
Хурдан оролт гаралт хийх тохиргоо хийсэн.
Программыг эхэлснээс дуусах хүртэлх хугацааг хэмжиж консолд хэвлэнэ.
Нэг эсвэл олон тестийг дамжуулан гүйцэтгэх боломжийг нээлттэй хадгалсан.
Ийм загвар нь хурдан ба цэгцтэй программ бичихэд маш тохиромжтой бөгөөд өрсөлдөөнт программчлалын хувьд үндсэн эхлэл болдог.
source : github