Open In App

Coin game of two corners (Greedy Approach)

Improve
Improve
Improve
Like Article
Like
Save Article
Save
Share
Report issue
Report

Consider a two-player coin game where each player gets turned one by one. There is a row of even a number of coins, and a player on his/her turn can pick a coin from any of the two corners of the row. The player that collects coins with more value wins the game. Develop a strategy for the player making the first turn, such that he/she never loses the game.

coinGame1

coinGame2

Note that the strategy to pick a maximum of two corners may not work. In the following example, the first player loses the game when he/she uses strategy to pick a maximum of two corners.

Example: 

  18 20 15 30 10 14
First Player picks 18, now row of coins is
  20 15 30 10 14
Second player picks 20, now row of coins is
  15 30 10 14
First Player picks 15, now row of coins is
  30 10 14
Second player picks 30, now row of coins is
  10 14
First Player picks 14, now row of coins is
  10 
Second player picks 10, game over.

The total value collected by second player is more (20 + 
30 + 10) compared to first player (18 + 15 + 14).
So the second player wins. 

Note that this problem is different from Optimal Strategy for a Game | DP-31. There the target is to get maximum value. Here the target is to not lose. We have a Greedy Strategy here. The idea is to count sum of values of all even coins and odd coins, and compare the two values. The player that makes the first move can always make sure that the other player is never able to choose an even coin if the sum of even coins is higher. Similarly, he/she can make sure that the other player is never able to choose an odd coin if the sum of odd coins is higher.

Example:  

  18 20 15 30 10 14
Sum of odd coins = 18 + 15 + 10 = 43
Sum of even coins = 20 + 30 + 14 = 64. 
Since the sum of even coins is more, the first 
player decides to collect all even coins. He first
picks 14, now the other player can only pick a coin 
(10 or 18). Whichever is picked the other player, 
the first player again gets an opportunity to pick 
an even coin and block all even coins. 

Implementation:

C++




// CPP program to find coins to be picked to make sure
// that we never loose.
#include <iostream>
using namespace std;
 
// Returns optimal value possible that a player can collect
// from an array of coins of size n. Note than n must be even
void printCoins(int arr[], int n)
{
    // Find sum of odd positioned coins
    int oddSum = 0;
    for (int i = 0; i < n; i += 2)
        oddSum += arr[i];
 
    // Find sum of even positioned coins
    int evenSum = 0;
    for (int i = 1; i < n; i += 2)
        evenSum += arr[i];
 
    // Print even or odd coins depending upon
    // which sum is greater.
    int start = ((oddSum > evenSum) ? 0 : 1);
    for (int i = start; i < n; i += 2)
        cout << arr[i] << " ";
}
 
// Driver program to test above function
int main()
{
    int arr1[] = { 8, 15, 3, 7 };
    int n = sizeof(arr1) / sizeof(arr1[0]);
    printCoins(arr1, n);
    cout << endl;
 
    int arr2[] = { 2, 2, 2, 2 };
    n = sizeof(arr2) / sizeof(arr2[0]);
    printCoins(arr2, n);
    cout << endl;
 
    int arr3[] = { 20, 30, 2, 2, 2, 10 };
    n = sizeof(arr3) / sizeof(arr3[0]);
    printCoins(arr3, n);
 
    return 0;
}


Java




// Java program to find coins to be
// picked to make sure that we never loose.
class GFG
{
 
// Returns optimal value possible
// that a player can collect from
// an array of coins of size n.
// Note than n must be even
static void printCoins(int arr[], int n)
{
// Find sum of odd positioned coins
int oddSum = 0;
for (int i = 0; i < n; i += 2)
    oddSum += arr[i];
 
// Find sum of even positioned coins
int evenSum = 0;
for (int i = 1; i < n; i += 2)
    evenSum += arr[i];
 
// Print even or odd coins depending
// upon which sum is greater.
int start = ((oddSum > evenSum) ? 0 : 1);
for (int i = start; i < n; i += 2)
    System.out.print(arr[i]+" ");
}
 
// Driver Code
public static void main(String[] args)
{
    int arr1[] = { 8, 15, 3, 7 };
    int n = arr1.length;
    printCoins(arr1, n);
    System.out.println();
 
    int arr2[] = { 2, 2, 2, 2 };
    n = arr2.length;
    printCoins(arr2, n);
    System.out.println();
 
    int arr3[] = { 20, 30, 2, 2, 2, 10 };
    n = arr3.length;
    printCoins(arr3, n);
}
}
 
// This code is contributed by ChitraNayal


Python3




# Python3 program to find coins
# to be picked to make sure that
# we never loose
 
# Returns optimal value possible
# that a player can collect from
# an array of coins of size n.
# Note than n must be even
def printCoins(arr, n) :
 
    oddSum = 0
     
    # Find sum of odd positioned coins
    for i in range(0, n, 2) :
        oddSum += arr[i]
 
    evenSum = 0
     
    # Find sum of even
    # positioned coins
    for i in range(1, n, 2) :
        evenSum += arr[i]
 
    # Print even or odd
    # coins depending upon
    # which sum is greater.
    if oddSum > evenSum :
        start = 0
    else :
        start = 1
 
    for i in range(start, n, 2) :
        print(arr[i], end = " ")
 
# Driver code
if __name__ == "__main__" :
     
    arr1 = [8, 15, 3, 7]
    n = len(arr1)
    printCoins(arr1, n)
    print()
     
    arr2 = [2, 2, 2, 2]
    n = len(arr2)
    printCoins(arr2, n)
    print()
     
    arr3 = [20, 30, 2, 2, 2, 10]
    n = len(arr3)
    printCoins(arr3, n)
     
# This code is contributed by ANKITRAI1


C#




// C# program to find coins to be
// picked to make sure that we never loose.
using System;
 
class GFG
{
 
// Returns optimal value possible
// that a player can collect from
// an array of coins of size n.
// Note than n must be even
static void printCoins(int[] arr, int n)
{
     
// Find sum of odd positioned coins
int oddSum = 0;
for (int i = 0; i < n; i += 2)
    oddSum += arr[i];
 
// Find sum of even positioned coins
int evenSum = 0;
for (int i = 1; i < n; i += 2)
    evenSum += arr[i];
 
// Print even or odd coins depending
// upon which sum is greater.
int start = ((oddSum > evenSum) ? 0 : 1);
for (int i = start; i < n; i += 2)
    Console.Write(arr[i]+" ");
}
 
// Driver Code
public static void Main()
{
    int[] arr1 = { 8, 15, 3, 7 };
    int n = arr1.Length;
    printCoins(arr1, n);
    Console.Write("\n");
 
    int[] arr2 = { 2, 2, 2, 2 };
    n = arr2.Length;
    printCoins(arr2, n);
    Console.Write("\n");
 
    int[] arr3 = { 20, 30, 2, 2, 2, 10 };
    n = arr3.Length;
    printCoins(arr3, n);
}
}
 
// This code is contributed by ChitraNayal


PHP




<?php
// PHP program to find coins to be
// picked to make sure that we never loose.
 
// Returns optimal value possible
// that a player can collect from
// an array of coins of size n.
// Note than n must be even
function printCoins(&$arr, $n)
{
    // Find sum of odd positioned coins
    $oddSum = 0;
    for ($i = 0; $i < $n; $i += 2)
        $oddSum += $arr[$i];
 
    // Find sum of even positioned coins
    $evenSum = 0;
    for ($i = 1; $i < $n; $i += 2)
        $evenSum += $arr[$i];
 
    // Print even or odd coins depending
    // upon which sum is greater.
    $start = (($oddSum > $evenSum) ? 0 : 1);
    for ($i = $start; $i < $n; $i += 2)
        echo $arr[$i]." ";
}
 
// Driver Code
$arr1 = array( 8, 15, 3, 7 );
$n = sizeof($arr1);
printCoins($arr1, $n);
echo "\n";
 
$arr2 = array( 2, 2, 2, 2 );
$n = sizeof($arr2);
printCoins($arr2, $n);
echo "\n";
 
$arr3 = array( 20, 30, 2, 2, 2, 10 );
$n = sizeof($arr3);
printCoins($arr3, $n);
 
// This code is contributed by ChitraNayal
?>


Javascript




<script>
 
// Javascript program to find coins to
// be picked to make sure that we never
// loose.
 
// Returns optimal value possible that
// a player can collect from an array
// of coins of size n. Note than n must be even
function printCoins(arr, n)
{
     
    // Find sum of odd positioned coins
    var oddSum = 0;
    for(var i = 0; i < n; i += 2)
        oddSum += arr[i];
 
    // Find sum of even positioned coins
    var evenSum = 0;
    for(var i = 1; i < n; i += 2)
        evenSum += arr[i];
 
    // Print even or odd coins depending upon
    // which sum is greater.
    var start = ((oddSum > evenSum) ? 0 : 1);
    for(var i = start; i < n; i += 2)
        document.write(arr[i] + " ");
}
 
// Driver code
var arr1 = [ 8, 15, 3, 7 ]
var n = arr1.length;
printCoins(arr1, n);
document.write("<br>");
 
var arr2 = [ 2, 2, 2, 2 ]
var n = arr2.length;
printCoins(arr2, n);
document.write("<br>");
 
var arr3 = [ 20, 30, 2, 2, 2, 10 ]
n = arr3.length;
printCoins(arr3, n);
 
// This code is contributed by noob2000
 
</script>


Output

15 7 
2 2 
30 2 10 

Complexity Analysis:

  • Time Complexity: O(n) 
  • Auxiliary Space: O(1)


Last Updated : 01 Sep, 2022
Like Article
Save Article
Share your thoughts in the comments
Similar Reads