Maximum amount of money that can be collected by a player in a game of coins - GeeksforGeeks

08 Jun, 2021
Given a 2D array Arr[][] consisting of N rows and two persons A and B playing a game of alternate turns based on the following rules:
A row is chosen at random, where A can only take the leftmost remaining coin while B can only take the rightmost remaining coin in the chosen row.
The game ends when there are no coins left.
The task is to determine the maximum amount of money obtained by A.
 Examples:
Input: N = 2, Arr[][] = {{ 5, 2, 3, 4 }, { 1, 6 }}Output: 8Explanation: Row 1: 5, 2, 3, 4Row 2: 1, 6Operations:
A takes the coin with value 5B takes the coin with value 4A takes the coin with value 2B takes the coin with value 3A takes the coin with value 1B takes the coin with value 6
A takes the coin with value 5
B takes the coin with value 4
A takes the coin with value 2
B takes the coin with value 3
A takes the coin with value 1
B takes the coin with value 6
Optimally, money collected by A = 5 + 2 + 1 = 8 Money collected by B = 3 + 4 + 6 = 13
Input: N = 1, Arr[] = {{ 1, 2, 3 }}Output : 3
  Approach: Follow the steps below to solve the problem
In a game played with optimal strategyInitialize a variable, say amount, to store the money obtained by A.If N is even, A will collect the first half of the coinsOtherwise, first, (N / 2) coins would be collected by A and last (N / 2) would be collected by BIf N is odd, the coin at the middle can be collected by A or B, depending upon the sequence of moves.Store the coin at the middle of all odd sized rows in a variable, say mid_odd[].Sort the array mid_odd[] in descending order.Optimally, A would collect all coins at even indices of min_odd[]Finally, print the score of A.
In a game played with optimal strategy
Initialize a variable, say amount, to store the money obtained by A.
If N is even, A will collect the first half of the coins
Otherwise, first, (N / 2) coins would be collected by A and last (N / 2) would be collected by B
If N is odd, the coin at the middle can be collected by A or B, depending upon the sequence of moves.
Store the coin at the middle of all odd sized rows in a variable, say mid_odd[].
Sort the array mid_odd[] in descending order.
Optimally, A would collect all coins at even indices of min_odd[]
Finally, print the score of A.
Below is the implementation of the above approach:
C++
Java
Python3
C#
Javascript
// CPP Program to implement// the above approach#include<bits/stdc++.h>using namespace std; // Function to calculate the// maximum amount collected by Avoid find(int N,  vector<vector<int>>Arr){         // Stores the money    // obtained by A    int amount = 0;     // Stores mid elements    // of odd sized rows    vector<int> mid_odd;    for(int i = 0; i < N; i++)    {         // Size of current row        int siz = Arr[i].size();         // Increase money collected by A        for (int j = 0; j < siz / 2; j++)            amount = amount + Arr[i][j];         if(siz % 2 == 1)            mid_odd.push_back(Arr[i][siz/2]);    }     // Add coins at even indices    // to the amount collected by A    sort(mid_odd.begin(),mid_odd.end());     for(int i = 0; i < mid_odd.size(); i++)        if (i % 2 == 0)         amount = amount + mid_odd[i];     // Print the amount    cout<<amount<<endl; } // Driver Codeint main(){   int N = 2;   vector<vector<int>>Arr{{5, 2, 3, 4}, {1, 6}};    // Function call to calculate the   // amount of coins collected by A   find(N, Arr);} // This code is contributed by ipg2016107.
// Java program to implement// the above approachimport java.util.*;class GFG{  // Function to calculate the// maximum amount collected by Astatic void find(int N, int[][] Arr){         // Stores the money    // obtained by A    int amount = 0;     // Stores mid elements    // of odd sized rows    ArrayList<Integer> mid_odd            = new ArrayList<Integer>();    for(int i = 0; i < N; i++)    {         // Size of current row        int siz = Arr[i].length;         // Increase money collected by A        for (int j = 0; j < siz / 2; j++)            amount = amount + Arr[i][j];         if(siz % 2 == 1)            mid_odd.add(Arr[i][siz/2]);    }     // Add coins at even indices    // to the amount collected by A    Collections.sort(mid_odd);         for(int i = 0; i < mid_odd.size(); i++){        if (i % 2 == 0)         amount = amount + mid_odd.get(i);    }     // Print the amount    System.out.println(amount);} // Driver Codepublic static void main(String[] args){    int N = 2;   int[][] Arr = {{5, 2, 3, 4}, {1, 6}};    // Function call to calculate the   // amount of coins collected by A   find(N, Arr);}}  // This code is contributed by splevel62.
# Python Program to implement# the above approach # Function to calculate the# maximum amount collected by A  def find(N, Arr):     # Stores the money    # obtained by A    amount = 0     # Stores mid elements    # of odd sized rows    mid_odd = []     for i in range(N):         # Size of current row        siz = len(Arr[i])         # Increase money collected by A        for j in range(0, siz // 2):            amount = amount + Arr[i][j]         if(siz % 2 == 1):            mid_odd.append(Arr[i][siz // 2])     # Add coins at even indices    # to the amount collected by A    mid_odd.sort(reverse=True)     for i in range(len(mid_odd)):        if i % 2 == 0:            amount = amount + mid_odd[i]     # Print the amount    print(amount)  # Driver Code N = 2Arr = [[5, 2, 3, 4], [1, 6]] # Function call to calculate the# amount of coins collected by Afind(N, Arr)
// C# Program to implement// the above approachusing System;using System.Collections.Generic;class GFG {   // Function to calculate the  // maximum amount collected by A  static void find(int N, List<List<int>> Arr)  {     // Stores the money    // obtained by A    int amount = 0;     // Stores mid elements    // of odd sized rows    List<int> mid_odd = new List<int>();    for(int i = 0; i < N; i++)    {       // Size of current row      int siz = Arr[i].Count;       // Increase money collected by A      for (int j = 0; j < siz / 2; j++)        amount = amount + Arr[i][j];       if(siz % 2 == 1)        mid_odd.Add(Arr[i][siz/2]);    }     // Add coins at even indices    // to the amount collected by A    mid_odd.Sort();     for(int i = 0; i < mid_odd.Count; i++)      if (i % 2 == 0)        amount = amount + mid_odd[i];     // Print the amount    Console.WriteLine(amount);   }   // Driver code  static void Main()  {    int N = 2;    List<List<int>> Arr = new List<List<int>>();    Arr.Add(new List<int>());    Arr[0].Add(5);    Arr[0].Add(2);    Arr[0].Add(3);    Arr[0].Add(4);    Arr.Add(new List<int>());    Arr[1].Add(1);    Arr[1].Add(6);     // Function call to calculate the    // amount of coins collected by A    find(N, Arr);  }} // This code is contributed by divyesh072019.
<script> // Javascript Program to implement// the above approach // Function to calculate the// maximum amount collected by Afunction find(N,  Arr){         // Stores the money    // obtained by A    var amount = 0;     // Stores mid elements    // of odd sized rows    var mid_odd = [];    for(var i = 0; i < N; i++)    {         // Size of current row        var siz = Arr[i].length;         // Increase money collected by A        for (var j = 0; j < siz / 2; j++)            amount = amount + Arr[i][j];         if(siz % 2 == 1)            mid_odd.push(Arr[i][siz/2]);    }     // Add coins at even indices    // to the amount collected by A    mid_odd.sort((a,b)=>a-b)     for(var i = 0; i < mid_odd.length; i++)        if (i % 2 == 0)         amount = amount + mid_odd[i];     // Print the amount    document.write( amount + "<br>"); } // Driver Codevar N = 2;var Arr = [[5, 2, 3, 4], [1, 6]]; // Function call to calculate the// amount of coins collected by Afind(N, Arr); // This code is contributed by importantly.</script>
8
 
Time Complexity : O(N)Auxiliary Space : O(1)
ipg2016107
splevel62
divyesh072019
importantly
adnanirshad158
Arrays
Mathematical
Pattern Searching
Arrays
Mathematical
Pattern Searching
Writing code in comment?
Please use ide.geeksforgeeks.org,
generate link and share the link here.
Comments
Old Comments
Window Sliding Technique
Program to find sum of elements in a given array
Reversal algorithm for array rotation
Find duplicates in O(n) time and O(1) extra space | Set 1
Trapping Rain Water
Program for Fibonacci numbers
C++ Data Types
Write a program to print all permutations of a given string
Set in C++ Standard Template Library (STL)
Coin Change | DP-7