Passing the Assignment

Rachel is submitting assignment from every student. She has given them a few minutes to arrange their assignments before submission. Just then Rahul remembers that his assignment is with Rohan. Rohan has to pass the assignment to Rahul. All the students are sitting in a straight line. He cannot pass the assignment in front of the teacher because then she will assume they have copied the assignment and will punish both of them. We have to help Rohan to find a way to pass the assignment to Rahul in such a way that he is not caught.
Assignment can be passed under some restrictions as given below:

  • A student i can pass the assignment only to his immediate neighbor i.e i-1 and i+1
  • At any given time a student may pass the assignment to other student, accept the assignment from some other student or may keep the assignment to himself.
  • Teacher is keeping watch over students from l_i to r_i including both l_i and r_i
  • If a student is being watched he cannot pass the note or accept the note, otherwise he is caught.
  • If he keeps the assignment and he is being watched, he is not caught.

Given four inputs n, m, s, f where n is the total number of students, m is the number of steps during which teacher keeps vigil over students from l_i to r_i, s is the position of Rohan and f is the position of Rahul.
Each m query contains three inputs: The time at which she is watching, the leftmost child she is watching and the rightmost child she is watching.
We have to output a sequence of three words: "Left" "Right" and "Keep" denoting the passing direction of current student.



Examples:

Input: n = 4, m = 4, s = 3, f = 4
        1 2 4
        2 1 2
        3 3 4
        4 2 3
Output: KeepRight
During time = 1, teacher is watching all 
the student from 2 to 4. Student 3 who 
has the assignment therefore cannot pass
it to his neighbor, thus he keeps the
assignment. During time = 2, teacher is
watching student 1 and 2, therefore 
student 3 can pass the assignment to 
his right to student 4. Since student
4 is Rahul therefore our answer is
"KeepRight"

Input: n = 10, m = 1, s = 1, f = 10
       1 5 6
Output: RightRightRightRightRightRight
        RightRightRightRight
During time = 1, teacher is watching 
student 5 and 6 therefore student 1 
can easily pass the assignment to his 
right to student 2. After this teacher 
stops watching any student therefore 
they can keep on passing the assignment 
to their right until the assignment 
reaches Rahul. Therefore the answer is 
"RightRightRightRightRightRight
    RightRightRightRight"

Approach:
At a given moment if the teacher is watching either the student currently holding the assignment or the student to whom the assignment is to be passed, then the student will keep it to himself else he will pass the assignment to his neighbor sitting towards Rahul.

Below is the implementation:

C++

filter_none

edit
close

play_arrow

link
brightness_4
code

// CPP program to find the way
#include <bits/stdc++.h>
using namespace std;
  
void solve(int n, int m, int s, int f,
        long t[], int l[], int r[])
{
  
    int dir;
    string val;
  
    // If Rahul sits to right of Rohan
    // then student will either pass
    // it right or keep it to himself
    if (s < f) {
        dir = 1;
        val = "Right";
    }
  
    // If Rahul sits to left of Rohan
    // then student will either pass
    // it left or keep it to himself
    else {
        dir = -1;
        val = "Left";
    }
    string ans = "";
  
    // current is keeping track of
    // the position of assignment
    // at a given time
    int i = 0, current = s;
  
    // tim variable keeping track of
    // current time
    long tim = 1;
    while (1) {
  
        // If time duration of query
        // matches with the current time
        if (i < m && tim == t[i]) {
  
            // If teacher is watching the
            // student having the assignment
            // or the student to whom the
            // assignment is to be passed
            // then the student keeps it to
            // itself
            if ((current >= l[i] && current <= r[i]) || 
               (current + dir >= l[i] && current + dir 
                                         <= r[i])) {
                ans += "Keep";
                tim++;
                i++;
                continue;
            }
            i++;
        }
  
        // If the students are safe then student
        // passes the assignment to his neighbor
        current += dir;
        ans += val;
        tim++;
  
        // If the assignment has reached Rahul
        // then we break the loop
        if (current == f)
            break;
    }
  
    cout << ans << endl;
}
  
// Driver function for the program
int main()
{
    int n = 4, m = 4, s = 3, f = 4;
  
    // matrix saving time for each query
    long t[m + 2] = { 1, 2, 3, 4 };
  
    // matrix saving leftmost child being
    // watched for each query
    int l[m + 2] = { 2, 1, 3, 2 };
  
    // matrix saving rightmost child
    // being watched for each query
    int r[m + 2] = { 4, 2, 4, 3 };
  
    solve(n, m, s, f, t, l, r);
    return 0;
}

chevron_right


Java

filter_none

edit
close

play_arrow

link
brightness_4
code

// Java progam to find the way
import java.io.*;
  
class Hiding {
    static void solve(int n, int m, int s, int f,
                    long t[], int l[], int r[])
    {
        int dir;
        String val;
  
        // If Rahul sits to right of Rohan
        // then student will either pass it
        // right or keep it to himself
        if (s < f) {
            dir = 1;
            val = "Right";
        }
  
        // If Rahul sits to left of Rohan then
        // student will either pass it left
        // or keep it to himself
        else {
            dir = -1;
            val = "Left";
        }
  
        String ans = "";
        int i = 0, current = s;
  
        // Variable keeping track of current time
        long tim = 1;
        while (1 > 0) {
              
            // If time duration of query
            // matches with the current time
            if (i < m && tim == t[i]) {
              
                // If teacher is watching the student
                // having the assignment or the
                // student to whom the assignment is
                // to be passed then the student
                // keeps it to itself
                if ((current >= l[i] && current <= r[i]) || 
                   (current + dir >= l[i] && current + dir 
                                              <= r[i])) {
                    ans += "Keep";
                    tim++;
                    i++;
                    continue;
                }
                i++;
            }
  
            // If the students are safe then student
            // passes the assignment to his neighbor
            current += dir;
            ans += val;
            tim++;
  
            // If the assignment has reached Rahul
            // then we break the loop
            if (current == f)
                break;
        }
        System.out.println(ans);
    }
  
    // Driver Program
    public static void main(String args[])
    {
        int n = 4, m = 4, s = 3, f = 4;
  
        // matrix saving time for each query
        long t[] = { 1, 2, 3, 4 };
  
        // matrix saving leftmost child 
        // being watched
        int l[] = { 2, 1, 3, 2 };
  
        // matrix saving rightmost child 
        // being watched
        int r[] = { 4, 2, 4, 3 };
  
        solve(n, m, s, f, t, l, r);
    }
}

chevron_right


C#

filter_none

edit
close

play_arrow

link
brightness_4
code

// C# progam to find the way
using System;
  
class Hiding
{
    static void solve(int n, int m, int s, int f,
                      long []t, int []l, int []r)
    {
        int dir;
        String val;
  
        // If Rahul sits to right of Rohan
        // then student will either pass it
        // right or keep it to himself
        if (s < f) {
            dir = 1;
            val = "Right";
        }
  
        // If Rahul sits to left of Rohan then
        // student will either pass it left
        // or keep it to himself
        else {
            dir = -1;
            val = "Left";
        }
  
        String ans = "";
        int i = 0, current = s;
  
        // Variable keeping track of current time
        long tim = 1;
        while (1 > 0) {
              
            // If time duration of query
            // matches with the current time
            if (i < m && tim == t[i]) {
              
                // If teacher is watching the student
                // having the assignment or the
                // student to whom the assignment is
                // to be passed then the student
                // keeps it to itself
                if ((current >= l[i] && current <= r[i]) || 
                    (current + dir >= l[i] && current +
                                          dir <= r[i])) 
                {
                    ans += "Keep";
                    tim++;
                    i++;
                    continue;
                }
                i++;
            }
  
            // If the students are safe then student
            // passes the assignment to his neighbor
            current += dir;
            ans += val;
            tim++;
  
            // If the assignment has reached Rahul
            // then we break the loop
            if (current == f)
                break;
        }
        Console.Write(ans);
    }
  
    // Driver Program
    public static void Main()
    {
        int n = 4, m = 4, s = 3, f = 4;
  
        // matrix saving time for each query
        long []t = { 1, 2, 3, 4 };
  
        // matrix saving leftmost 
        // child being watched
        int []l = { 2, 1, 3, 2 };
  
        // matrix saving rightmost
        // child being watched
        int []r = { 4, 2, 4, 3 };
  
        solve(n, m, s, f, t, l, r);
    }
}
  
// This code is contributed by nitin mittal

chevron_right



Output:

KeepRight


My Personal Notes arrow_drop_up

Check out this Author's contributed articles.

If you like GeeksforGeeks and would like to contribute, you can also write an article using contribute.geeksforgeeks.org or mail your article to contribute@geeksforgeeks.org. See your article appearing on the GeeksforGeeks main page and help other Geeks.

Please Improve this article if you find anything incorrect by clicking on the "Improve Article" button below.



Improved By : nitin mittal



Article Tags :

Be the First to upvote.


Please write to us at contribute@geeksforgeeks.org to report any issue with the above content.