একটি অ্যাসাইনমেন্ট ইনভিজিলেটরকে না বুঝিয়ে ছাত্র A-র হাতে পৌঁছাতে হবে। সব ছাত্র কিউয়ে বসে আছে। ছাত্র A (সূচক i) তার পাশের ছাত্র (i-1, i+1)-কে পাস করতে পারে। ইনভিজিলেটর [il, rl] রেঞ্জ দেখছে। এই রেঞ্জে থাকলে পাস বা রিসিভ করা যাবে না, কিন্তু রাখতে পারবে।
ইনপুট: p (মোট ছাত্র), q (ইনভিজিলেটরের ধাপ), r (A-এর পজিশন), s (B-এর পজিশন)। প্রতিটি ধাপে: সময়, বাম সীমা, ডান সীমা। আউটপুট: "Left", "Right", "Keep" সিকোয়েন্স।
উদাহরণ
ইনপুট: 8 3 2 7 / 1 4 6 / 2 1 8 / 3 5 6
আউটপুট: Right Keep Right Right Right Right
সমাধানের পদ্ধতি
লক্ষ্য দিকে যাওয়ার দিক নির্ণয় করুন (Left/Right)। প্রতিটি টাইম স্টেপে: ইনভিজিলেটর দেখছে কিনা চেক করুন। বর্তমান বা পরবর্তী ছাত্র ওয়াচ রেঞ্জে থাকলে "Keep", অন্যথায় লক্ষ্য দিকে পাস করুন।
উদাহরণ
#include <bits/stdc++.h>
using namespace std;
void solve(int p, int q, int r, int s, long t[], int l[], int ar[]) {
int dir; string val;
if (r < s) { dir = 1; val = "Right"; }
else { dir = -1; val = "Left"; }
string answer = "";
int i = 0, current = r; long tim = 1;
while (1) {
if (i < q && tim == t[i]) {
if ((current >= l[i] && current <= ar[i]) ||
(current + dir >= l[i] && current + dir <= ar[i])) {
answer += "Keep\n"; tim++; i++; continue;
}
i++;
}
current += dir;
answer += val + "\n";
tim++;
if (current == s) break;
}
cout << answer << endl;
}
int main() {
int p = 8, q = 3, r = 2, s = 7;
long t[3] = {1, 2, 3};
int l[3] = {4, 1, 5};
int ar[3] = {6, 8, 6};
solve(p, q, r, s, t, l, ar);
return 0;
}
আউটপুট
Right Keep Right Right Right Right
উপসংহার
কম্পিটিটিভ কোডিং-এর জন্য একটি গুরুত্বপূর্ণ অ্যালগরিদম যা রিয়েল লাইফ সমস্যা C++ দিয়ে সমাধান করে।