Thursday, May 19, 2022
HomeSoftware DevelopmentMost subtraction of Array values from Ok to make it 0 or...

Most subtraction of Array values from Ok to make it 0 or minimal


Given two arrays A[] and B[] (B[i] < A[i]) of measurement N every and an integer Ok, the duty is to carry out the operation of (Ok – A[i] + B[i]) the utmost variety of instances such that Ok turns into 0 or as minimal as doable.

Be aware: At no second an operation will likely be carried out such that Ok turns into damaging i.e. the operation can’t be carried out if Ok – A[i] is damaging and any index might be chosen as many instances as doable.

Examples:

Enter: N = 3, Ok = 3, A[] = {2, 3, 4}, B[] = {1, 1, 1}
Output: 2
Clarification: For optimum turns,  
Select A[0] and B[0], so  Ok = 3 – 2 + 1 = 2.
Select A[0] and B[0], so  Ok = 2 – 2 + 1 = 1.
No different operation is feasible. So max turns = 2.

Enter: N = 2, Ok = 10, A[] = {5, 4} B[] ={1, 2}
Output: 4

 

Method: The issue might be solved primarily based on the next thought:

For performing the operation most variety of instances, all the time preserve selecting the indices (say i) in order that A[i] – B[i] is minimal.

Say such worth is A[i] and B[i], so the utmost carried out operations for that index are (Ok – B[i]) / (A[i] – B[i]) [Here K – B[i] to keep away from the final operation the place Ok-A[i] is damaging]

Comply with the steps talked about beneath to implement the concept:

  • Create an array (say v) to retailer the values within the type of (A[i] – B[i], A[i]).
  • Type the array in growing order on the idea of (A[i] – B[i]).
  • Loop from i = 0 to N-1:
    • If Ok – second worth of v[i] will not be damaging then use the above components to search out its contribution (say x).
    • Increment the depend by x.
  • Return the ultimate depend as the reply.

Under is the implementation of the above strategy.

C++

  

#embrace <bits/stdc++.h>

utilizing namespace std;

  

int MakeitMin(int n, int okay, int a[], int b[])

{

    

    vector<pair<int, int> > v(n);

    for (int i = 0; i < n; i++)

        v[i] = { a[i] - b[i], a[i] };

  

    

    kind(v.start(), v.finish());

    int ans = 0;

    for (int i = 0; i < n; i++) {

  

        

        if (v[i].second > okay)

            proceed;

  

        

        

        

        int diff

            = (okay - (v[i].second - v[i].first)) / v[i].first;

        ans += diff;

  

        

        okay -= (diff * v[i].first);

    }

    return ans;

}

  

int foremost()

{

    int N = 2, Ok = 10;

    int A[] = { 5, 4 };

    int B[] = { 1, 2 };

    cout << MakeitMin(N, Ok, A, B);

    return 0;

}

Time Complexity: O(N * logN)
Auxiliary Area: O(N)

RELATED ARTICLES

Most Popular

Recent Comments