Minimum cost to reach a point N from 0 with two different operations allowed
Given integers N, P and Q where N denotes the destination position. The task is to move from position 0 to position N with minimum cost possible and print the calculated cost. All valid movements are:
- From position X you can go to position X + 1 with a cost of P
- Or, you can go to the position 2 * X with a cost of Q
Examples:
Input: N = 1, P = 3, Q = 4
Output: 3
Move from position 0 to 1st position with cost = 3.
Input: N = 9, P = 5, Q = 1
Output: 13
Move from position 0 to 1st position with cost = 5,
then 1st to 2nd with cost = 1,
then 2nd to 4th with cost = 1,
then 4th to 8th with cost = 1,
finally 8th to 9th with cost = 5.
Total cost = 5 + 1 + 1 + 1 + 5 = 13.
Approach: Instead of going from beginning to destination we can start moving from the destination to initial position and keep track of the cost of jumps.
- If N is odd then the only valid move that could lead us here is N-1 to N with a cost of P.
- If N is even then we calculate cost of going from N to N/2 position with both the moves and take the minimum of them.
- When N equals 0, we return our total calculated cost.
Below is the implementation of above approach:
C++
#include <bits/stdc++.h>
using namespace std;
int minCost( int N, int P, int Q)
{
int cost = 0;
while (N > 0) {
if (N & 1) {
cost += P;
N--;
}
else {
int temp = N / 2;
if (temp * P > Q)
cost += Q;
else
cost += P * temp;
N /= 2;
}
}
return cost;
}
int main()
{
int N = 9, P = 5, Q = 1;
cout << minCost(N, P, Q);
return 0;
}
|
Java
class GFG{
static int minCost( int N, int P, int Q)
{
int cost = 0 ;
while (N > 0 ) {
if ((N & 1 )> 0 ) {
cost += P;
N--;
}
else {
int temp = N / 2 ;
if (temp * P > Q)
cost += Q;
else
cost += P * temp;
N /= 2 ;
}
}
return cost;
}
public static void main(String[] args)
{
int N = 9 , P = 5 , Q = 1 ;
System.out.println(minCost(N, P, Q));
}
}
|
Python3
def minCost(N,P,Q):
cost = 0
while (N > 0 ):
if (N & 1 ):
cost + = P
N - = 1
else :
temp = N / / 2 ;
if (temp * P > Q):
cost + = Q
else :
cost + = P * temp
N / / = 2
return cost
N = 9
P = 5
Q = 1
print (minCost(N, P, Q))
|
C#
class GFG
{
static int minCost( int N, int P, int Q)
{
int cost = 0;
while (N > 0)
{
if ((N & 1) > 0)
{
cost += P;
N--;
}
else
{
int temp = N / 2;
if (temp * P > Q)
cost += Q;
else
cost += P * temp;
N /= 2;
}
}
return cost;
}
static void Main()
{
int N = 9, P = 5, Q = 1;
System.Console.WriteLine(minCost(N, P, Q));
}
}
|
PHP
<?php
function minCost( $N , $P , $Q )
{
$cost = 0;
while ( $N > 0)
{
if ( $N & 1)
{
$cost += $P ;
$N --;
}
else
{
$temp = $N / 2;
if ( $temp * $P > $Q )
$cost += $Q ;
else
$cost += $P * $temp ;
$N /= 2;
}
}
return $cost ;
}
$N = 9; $P = 5; $Q = 1;
echo minCost( $N , $P , $Q );
?>
|
Javascript
<script>
function minCost( N, P, Q)
{
var cost = 0;
while (N > 0) {
if (N & 1) {
cost += P;
N--;
}
else {
var temp =parseInt( N / 2);
if (temp * P > Q)
cost += Q;
else
cost += P * temp;
N = parseInt(N / 2);
}
}
return cost;
}
var N = 9, P = 5, Q = 1;
document.write( minCost(N, P, Q));
</script>
|
Time Complexity: O(N)
Auxiliary Space: O(1)
Last Updated :
16 Nov, 2021
Like Article
Save Article
Share your thoughts in the comments
Please Login to comment...