Given an array arr[] of N integers, where each array element is either 0, 1, or 2, and an integer K, the task is to print the minimum cost needed to convert all the elements of the array to 0s by selecting a subarray of size K and converting any array element of the subarray to 0 in one operation with the cost equal to the sum of elements of the subarray.
Examples:
Input: arr[] = {2, 0, 1, 1, 0, 2}, K = 3 Output: 3 Explanation: Perform the following steps:
- Select the subarray over the range [1, 3], and then flip the arr[2](= 1) to 0 at a cost of 2. The array modifies to arr[] = {2, 0, 0, 1, 0, 2}.
- Select the subarray over the range [1, 3], and then flip the arr[3](= 1) to 0 at a cost of 1. The array modifies to arr[] = {2, 0, 0, 0, 0, 2}.
- Select the subarray over the range [0, 2], and then flip the arr[0](= 2) to 0 at a cost of 2. The array modifies to arr[] = {0, 0, 0, 0, 0, 2}.
- Select the subarray over the range [3, 5], and then flip the arr[5](= 2) to 0 at a cost of 2. The array modifies to arr[] = {0, 0, 0, 0, 0, 0}.
Therefore, the total cost needed is (2+1+2+2 = 7). And it is also the minimum cost needed.
Input: arr[] = {1, 0, 2, 1}, K = 4 Output: 7
Approach: The given problem can be solved based on the following observations:
- It is optimal to first convert all the elements of the subarray of size K having the minimum cost and the maximum number of 2s to 0.
- Suppose X is the count of 1s, and Y is the count of 2s in the subarray with minimum cost. Then converting all 2s to 0 first and then all 1s to 0 will give the minimum cost to convert the subarray to 0.
- The cost of converting all 2s to 0 is:
- (X+2*Y)+(X+2*Y-2) +(X+2*Y-4)+ … +(X+2*Y-2*(Y-1))
= Y*(X+2*Y) – Y*(0+2*(Y-1))/2 = Y*(X+2*Y) – Y*(Y-1) = X*Y+2*Y2-Y2+Y = Y2 + X*Y + Y
- The cost of converting all remaining 1s to 0 is:
- X+ (X-1)+(X-2)+ … + 1
= (X*(X+1))/2
- Therefore, the cost of converting all elements of a subarray with X 1s and Y 2s is equal to:
- Now, the remaining elements can be converted to 0s by taking a subarray with K-1 0s and the element, which will be of cost equal to the element itself.
- Therefore, if the sum is the total sum of the array, then, the minimum cost will be equal to:
- sum-(X+2*Y) + Y2+X*Y+Y+(X*(X+1))/2
Follow the steps below to solve the problem:
- Initialize two arrays, say pcount1[] and pcount2[] as {0} where pcount1[i] and pcount2[i] store the count of 1s and 2s in the prefix over the range [0, i].
- Traverse the array, arr[] using the variable i and do the following:
- Assign pcount1[i] to pcount1[i+1] and pcount2[i] to pcount2[i+1].
- If arr[i] is 1, then increment pcount1[i+1]. Otherwise, if arr[i] is 2, then the increment count of pcount2[i+1].
- Find the sum of the array and store it in a variable, say sum.
- Initialize two variables, say X and Y, to store the count of 1s and 2s in the subarray with a minimum sum of size K.
- Iterate over the range [K, N] using the variable i and perform the following steps:
- Initialize two variables, say A and B, to store the count of 1s and 2s in the subarray over the range [i-K, K-1].
- Assign pcount1[i]-pcount1[i-K] to A, and pcount2[i]-pcount2[i-K] to B.
- If A+2*B is less than X+2*Y, then update X to A and Y to B.
- Finally, after completing the above steps, print the total cost as, sum-(X+2*Y) + Y2+X*Y+Y+(X*(X+1))/2.
Below is the implementation of the above approach:
C++
#include <bits/stdc++.h>
using namespace std;
int minCost( int arr[], int N, int K)
{
int pcount1[N + 1] = { 0 };
int pcount2[N + 1] = { 0 };
for ( int i = 1; i <= N; i++) {
pcount1[i] = pcount1[i - 1] + (arr[i - 1] == 1);
pcount2[i] = pcount2[i - 1] + (arr[i - 1] == 2);
}
int sum = pcount1[N] + 2 * pcount2[N];
int X = N;
int Y = N;
for ( int i = K; i <= N; i++) {
int A = pcount1[i] - pcount1[i - K];
int B = pcount2[i] - pcount2[i - K];
if (A + 2 * B < X + 2 * Y) {
X = A;
Y = B;
}
}
int total = sum - (X + 2 * Y) + Y * Y + X * Y + Y
+ (X * (X + 1)) / 2;
return total;
}
int main()
{
int arr[] = { 2, 0, 1, 1, 0, 2 };
int N = sizeof (arr) / sizeof (arr[0]);
int K = 3;
cout << minCost(arr, N, K);
return 0;
}
|
Java
import java.io.*;
import java.util.Arrays;
class GFG
{
static int minCost( int arr[], int N, int K)
{
int pcount1[] = new int [N + 1 ];
int pcount2[] = new int [N + 1 ];
Arrays.fill(pcount1, 0 );
Arrays.fill(pcount2, 0 );
for ( int i = 1 ; i <= N; i++) {
int k = 0 ;
int l = 0 ;
if (arr[i - 1 ] == 1 )
k = 1 ;
if (arr[i - 1 ] == 2 )
l = 1 ;
pcount1[i] = pcount1[i - 1 ] + k;
pcount2[i] = pcount2[i - 1 ] + l;
}
int sum = pcount1[N] + 2 * pcount2[N];
int X = N;
int Y = N;
for ( int i = K; i <= N; i++) {
int A = pcount1[i] - pcount1[i - K];
int B = pcount2[i] - pcount2[i - K];
if (A + 2 * B < X + 2 * Y) {
X = A;
Y = B;
}
}
int total = sum - (X + 2 * Y) + Y * Y + X * Y + Y
+ (X * (X + 1 )) / 2 ;
return total;
}
public static void main(String[] args)
{
int arr[] = { 2 , 0 , 1 , 1 , 0 , 2 };
int N = arr.length;
int K = 3 ;
System.out.println(minCost(arr, N, K));
}
}
|
Python3
def minCost(arr, N, K):
pcount1 = [ 0 ] * (N + 1 )
pcount2 = [ 0 ] * (N + 1 )
for i in range ( 1 ,N + 1 ):
pcount1[i] = pcount1[i - 1 ] + (arr[i - 1 ] = = 1 )
pcount2[i] = pcount2[i - 1 ] + (arr[i - 1 ] = = 2 )
sum = pcount1[N] + 2 * pcount2[N]
X = N
Y = N
for i in range (K, N + 1 ):
A = pcount1[i] - pcount1[i - K]
B = pcount2[i] - pcount2[i - K]
if (A + 2 * B < X + 2 * Y):
X = A
Y = B
total = sum - (X + 2 * Y) + Y * Y + X * Y + Y + (X * (X + 1 )) / / 2
return total
if __name__ = = '__main__' :
arr = [ 2 , 0 , 1 , 1 , 0 , 2 ]
N = len (arr)
K = 3
print (minCost(arr, N, K))
|
C#
using System;
using System.Collections.Generic;
class GFG{
static int minCost( int []arr, int N, int K)
{
int []pcount1 = new int [N + 1];
Array.Clear(pcount1, 0, N + 1);
int []pcount2 = new int [N + 1];
Array.Clear(pcount2, 0, N + 1);
for ( int i = 1; i <= N; i++) {
if (arr[i - 1] == 1){
pcount1[i] = pcount1[i - 1] + 1;
}
else
pcount1[i] = pcount1[i - 1];
if (arr[i - 1] == 2){
pcount2[i] = pcount2[i - 1] + 1;
}
else
pcount2[i] = pcount2[i - 1];
}
int sum = pcount1[N] + 2 * pcount2[N];
int X = N;
int Y = N;
for ( int i = K; i <= N; i++) {
int A = pcount1[i] - pcount1[i - K];
int B = pcount2[i] - pcount2[i - K];
if (A + 2 * B < X + 2 * Y) {
X = A;
Y = B;
}
}
int total = sum - (X + 2 * Y) + Y * Y + X * Y + Y
+ (X * (X + 1)) / 2;
return total;
}
public static void Main()
{
int []arr = { 2, 0, 1, 1, 0, 2 };
int N = arr.Length;
int K = 3;
Console.Write(minCost(arr, N, K));
}
}
|
Javascript
function minCost(arr, N, K)
{
let pcount1 = new Array(N + 1).fill(0);
let pcount2 = new Array(N + 1).fill(0);
for (let i = 1; i <= N; i++) {
pcount1[i] = pcount1[i - 1] + (arr[i - 1] == 1);
pcount2[i] = pcount2[i - 1] + (arr[i - 1] == 2);
}
let sum = pcount1[N] + 2 * pcount2[N];
let X = N;
let Y = N;
for (let i = K; i <= N; i++) {
let A = pcount1[i] - pcount1[i - K];
let B = pcount2[i] - pcount2[i - K];
if (A + 2 * B < X + 2 * Y) {
X = A;
Y = B;
}
}
let total = sum - (X + 2 * Y) + Y * Y + X * Y + Y
+ (X * (X + 1)) / 2;
return total;
}
let arr = [2, 0, 1, 1, 0, 2];
let N = arr.length;
let K = 3;
document.write(minCost(arr, N, K));
|
Time Complexity: O(N) Auxiliary Space: O(N)
|