# Candies

Posted: 26 Nov, 2020
Difficulty: Moderate

## PROBLEM STATEMENT

#### Example :

``````Given students' ratings : [5, 8, 1, 5, 9, 4].
He gives the students candy in the following minimal amounts : [1, 2, 1, 2, 3, 1]. He must buy a minimum of 10 candies.
``````

#### Note :

``````1. If two students having the same grade are standing next to each other, they may receive the same number of candies.
2. Every student must get at least a candy.
``````
##### Input format :
``````The first line of input contains an integer 'T' representing the number of the test case. Then the test case follows.

The first line of each test case contains an integer ‘N’ representing the number of students.

The second line of each test case contains 'N' space-separated integers representing the grades of each student.
``````
##### Output Format :
``````For each test case, print the minimum number of candies required.
``````
##### Note :
``````You don't need to print anything. It has already been taken care of. Just implement the given function.
``````
##### Constraints :
``````1 <= T <= 10^2
1 <= N <= 10^4
1 <= STUDENTS[i] <= 10^5

Time Limit : 1 sec
``````
Approach 1

There can be four cases :

CASE 1: STUDENTS[i - 1]  > STUDENTS[i]  < STUDENTS[i + 1]

CASE 2: STUDENTS[i - 1]  < STUDENTS[i]  < STUDENTS[i + 1]

CASE 3: STUDENTS[i - 1]  > STUDENTS[i]  > STUDENTS[i + 1]

CASE 4: STUDENTS[i - 1]  < STUDENTS[i]  > STUDENTS[i + 1]

1. For case 1, the ‘i’th child will get one candy.
2. For case 2, the ‘i’th child will get ‘CANDIES’[i - 1] + 1 candies.
3. For case 3, the ‘i’th child will get 'CANDIES'[i + 1] + 1 candies.
4. For case 4, the ‘i’th child will get MAX('CANDIES'[i - 1],'CANDIES'[i + 1]) + 1 candies.

Here is the algorithm :

1. Create an array (say, ‘CANDIES’) of size ‘N’.
2. Run a loop from 0 to ‘N’ (say, iterator ‘i’) over ‘STUDENTS’[i] :
• If ‘STUDENTS’[i -1] ≥ ‘STUDENTS’[i] and ‘STUDENTS’[i] ≤ ‘STUDENTS’[i + 1], do ‘CANDIES’[i] = 1.
3. Run a loop from 0 to ‘N’ (say, iterator ‘i’) over ‘STUDENTS’[i] :
• If ‘STUDENTS’[i - 1] < ‘STUDENTS’[i] and ‘STUDENTS’[i] < ‘STUDENTS’[i + 1], do ‘CANDIES’[i] = ‘CANDIES’[i - 1] + 1.
4. Run a loop from ‘N’ - 1 to 0 (say, iterator ‘i’) over ‘STUDENTS’[i] :
• If ‘STUDENTS’[i - 1] ≥ ‘STUDENTS’[i] and ‘STUDENTS’[i] ≥ ‘STUDENTS’[i + 1], do ‘CANDIES’[i] = ‘CANDIES’[i + 1] + 1.
5. Run a loop from 0 to ‘N' (say, iterator ‘i’) over ‘STUDENTS’[i] :
• If ‘STUDENTS’[i - 1] < ‘STUDENTS’[i] and ‘STUDENTS’[i] ≥ ‘STUDENTS’[i + 1], do ‘CANDIES’[i] = MAX('CANDIES'[i - 1], ‘CANDIES’[i + 1]) + 1.
6. Create a variable (say, ‘ANS’) and initialise it to 0.
7. Run a loop from 0 to ‘N’ (say, iterator ‘i’) add ‘CANDIES’[i] to ‘ANS’.
8. Finally, return ‘ANS’.