Given an array **A[]** of size **N***(1 ≤ N ≤ 10 ^{5})*, consisting of positive integers, where the score of an index

**i**in range

**[0, N – 1]**is defined as:

Score[i] = A[i] * ((i + A[i] < N) ? Score(i + A[i]) : 1)

The task is to find the index with minimum score.

**Examples:**

Input:A[] = {1, 2, 3, 4, 5}Output:2Explanation:

- Score[4] = 5 * 1 = 5
- Score[3]. = 4 * 1 = 4
- Score[2] = 3 * 1 = 3
(Minimum)- Score[1] = 2 * Score[3] = 2 * 4 = 8
- Score[0] = 1 * Score[1] = 1 * 8 = 8

Input:A[] = {9, 8, 1, 2, 3, 6}Output: 4

**Approach:** Follow the steps below to solve the problem

- Traverse the array in reverse, i.e. iterate from
**i = N – 1**to**0**. - For every
**i**, check if**(A[i] + i)**is less than**N**or not. - Update
**score[i]**for index**i**as S**core[i] = A[i] * ((i + A[i] < N) ? Score(i + A[i]) ? 1)** - Print the index with minimum score.

**Below is the implementation of above approach:**

## C++

`// C++ program for the above approach` `#include <bits/stdc++.h>` `using` `namespace` `std;` `//Function to find the index` `//with minimum score` `void` `Min_Score_Index(` `int` `N, vector<` `int` `> A){` ` ` `//Stores the score of current index` ` ` `vector<` `int` `> Score(N,0);` ` ` `//Traverse the array in reverse` ` ` `for` `(` `int` `i=N-1;i>=0;i--){` ` ` `if` `(A[i] + i < N)` ` ` `Score[i] = A[i] * Score[A[i] + i];` ` ` `else` ` ` `Score[i] = A[i];` ` ` `}` ` ` `//Update minimum score` ` ` `int` `min_value = INT_MAX;` ` ` `for` `(` `int` `i:Score) min_value = min(i,min_value);` ` ` `//Print the index with minimum score` ` ` `int` `ind = 0;` ` ` `for` `(` `int` `i=0;i<N;i++){` ` ` `if` `(Score[i]==min_value) ind = i;` ` ` `}` ` ` `cout<<(ind);` `}` `//Driver Code` `int` `main(){` ` ` `int` `N = 5;` ` ` `vector<` `int` `> A ={1, 2, 3, 4, 5};` ` ` `Min_Score_Index(N, A);` `}` |

## Java

`// Java program for the above approach` `import` `java.util.*;` `class` `GFG` `{` `// Function to find the index` `// with minimum score` `static` `void` `Min_Score_Index(` `int` `N, ` `int` `[]A)` `{` ` ` `// Stores the score of current index` ` ` `int` `[]Score = ` `new` `int` `[N];` ` ` `// Traverse the array in reverse` ` ` `for` `(` `int` `i = N - ` `1` `; i >= ` `0` `; i--)` ` ` `{` ` ` `if` `(A[i] + i < N)` ` ` `Score[i] = A[i] * Score[A[i] + i];` ` ` `else` ` ` `Score[i] = A[i];` ` ` `}` ` ` `// Update minimum score` ` ` `int` `min_value = Integer.MAX_VALUE;` ` ` `for` `(` `int` `i:Score) min_value = Math.min(i, min_value);` ` ` `// Print the index with minimum score` ` ` `int` `ind = ` `0` `;` ` ` `for` `(` `int` `i = ` `0` `; i < N; i++)` ` ` `{` ` ` `if` `(Score[i] == min_value)` ` ` `ind = i;` ` ` `}` ` ` `System.out.print(ind);` `}` `// Driver Code` `public` `static` `void` `main(String[] args)` `{` ` ` `int` `N = ` `5` `;` ` ` `int` `[]A ={` `1` `, ` `2` `, ` `3` `, ` `4` `, ` `5` `};` ` ` `Min_Score_Index(N, A);` `}` `}` `// This code is contributed by 29AjayKumar` |

## Python3

`# Python3 program for the above approach` `# Function to find the index` `# with minimum score` `def` `Min_Score_Index(N, A):` ` ` `# Stores the score of current index` ` ` `Score ` `=` `[` `0` `] ` `*` `N` ` ` `# Traverse the array in reverse` ` ` `for` `i ` `in` `range` `(N ` `-` `1` `, ` `-` `1` `, ` `-` `1` `):` ` ` `if` `A[i] ` `+` `i < N:` ` ` `Score[i] ` `=` `A[i] ` `*` `Score[A[i] ` `+` `i]` ` ` `else` `:` ` ` `Score[i] ` `=` `A[i]` ` ` `# Update minimum score` ` ` `min_value ` `=` `min` `(Score)` ` ` `# Print the index with minimum score` ` ` `ind ` `=` `Score.index(min_value)` ` ` `print` `(ind)` `# Driver Code` `if` `__name__ ` `=` `=` `"__main__"` `:` ` ` `N ` `=` `5` ` ` `A ` `=` `[` `1` `, ` `2` `, ` `3` `, ` `4` `, ` `5` `]` ` ` `Min_Score_Index(N, A)` `# This code is contributed by mohit kumar 29` |

## C#

`// C# program for the above approach` `using` `System;` `class` `GFG{` `// Function to find the index` `// with minimum score` `static` `void` `Min_Score_Index(` `int` `N, ` `int` `[] A)` `{` ` ` ` ` `// Stores the score of current index` ` ` `int` `[] Score = ` `new` `int` `[N];` ` ` `// Traverse the array in reverse` ` ` `for` `(` `int` `i = N - 1; i >= 0; i--)` ` ` `{` ` ` `if` `(A[i] + i < N)` ` ` `Score[i] = A[i] * Score[A[i] + i];` ` ` `else` ` ` `Score[i] = A[i];` ` ` `}` ` ` `// Update minimum score` ` ` `int` `min_value = Int32.MaxValue;` ` ` `foreach` `(` `int` `i ` `in` `Score)` ` ` `{` ` ` `min_value = Math.Min(i, min_value);` ` ` `}` ` ` `// Print the index with minimum score` ` ` `int` `ind = 0;` ` ` `for` `(` `int` `i = 0; i < N; i++)` ` ` `{` ` ` `if` `(Score[i] == min_value)` ` ` `ind = i;` ` ` `}` ` ` `Console.WriteLine(ind);` `}` `// Driver Code` `public` `static` `void` `Main()` `{` ` ` `int` `N = 5;` ` ` `int` `[] A = { 1, 2, 3, 4, 5 };` ` ` ` ` `Min_Score_Index(N, A);` `}` `}` `// This code is contributed by chitranayal` |

**Output:**

2

**Time Complexity: **O(N)**Auxiliary Space:** O(N)

Attention reader! Don’t stop learning now. Get hold of all the important DSA concepts with the **DSA Self Paced Course** at a student-friendly price and become industry ready.