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.


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++
#include <iostream>
using namespace std;
void printCoins( int arr[], int n)
{
int oddSum = 0;
for ( int i = 0; i < n; i += 2)
oddSum += arr[i];
int evenSum = 0;
for ( int i = 1; i < n; i += 2)
evenSum += arr[i];
int start = ((oddSum > evenSum) ? 0 : 1);
for ( int i = start; i < n; i += 2)
cout << arr[i] << " " ;
}
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
class GFG
{
static void printCoins( int arr[], int n)
{
int oddSum = 0 ;
for ( int i = 0 ; i < n; i += 2 )
oddSum += arr[i];
int evenSum = 0 ;
for ( int i = 1 ; i < n; i += 2 )
evenSum += arr[i];
int start = ((oddSum > evenSum) ? 0 : 1 );
for ( int i = start; i < n; i += 2 )
System.out.print(arr[i]+ " " );
}
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);
}
}
|
Python3
def printCoins(arr, n) :
oddSum = 0
for i in range ( 0 , n, 2 ) :
oddSum + = arr[i]
evenSum = 0
for i in range ( 1 , n, 2 ) :
evenSum + = arr[i]
if oddSum > evenSum :
start = 0
else :
start = 1
for i in range (start, n, 2 ) :
print (arr[i], end = " " )
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)
|
C#
using System;
class GFG
{
static void printCoins( int [] arr, int n)
{
int oddSum = 0;
for ( int i = 0; i < n; i += 2)
oddSum += arr[i];
int evenSum = 0;
for ( int i = 1; i < n; i += 2)
evenSum += arr[i];
int start = ((oddSum > evenSum) ? 0 : 1);
for ( int i = start; i < n; i += 2)
Console.Write(arr[i]+ " " );
}
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);
}
}
|
PHP
<?php
function printCoins(& $arr , $n )
{
$oddSum = 0;
for ( $i = 0; $i < $n ; $i += 2)
$oddSum += $arr [ $i ];
$evenSum = 0;
for ( $i = 1; $i < $n ; $i += 2)
$evenSum += $arr [ $i ];
$start = (( $oddSum > $evenSum ) ? 0 : 1);
for ( $i = $start ; $i < $n ; $i += 2)
echo $arr [ $i ]. " " ;
}
$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 );
?>
|
Javascript
<script>
function printCoins(arr, n)
{
var oddSum = 0;
for ( var i = 0; i < n; i += 2)
oddSum += arr[i];
var evenSum = 0;
for ( var i = 1; i < n; i += 2)
evenSum += arr[i];
var start = ((oddSum > evenSum) ? 0 : 1);
for ( var i = start; i < n; i += 2)
document.write(arr[i] + " " );
}
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);
</script>
|
Complexity Analysis:
- Time Complexity: O(n)
- Auxiliary Space: O(1)
Feeling lost in the world of random DSA topics, wasting time without progress? It's time for a change! Join our DSA course, where we'll guide you on an exciting journey to master DSA efficiently and on schedule.
Ready to dive in? Explore our Free Demo Content and join our DSA course, trusted by over 100,000 geeks!
Last Updated :
01 Sep, 2022
Like Article
Save Article