Fine Radar
The News Hub

Maximum non overlapping Subset with sum greater than K – GeeksforGeeks

Improve Article

Save Article

Like Article

Improve Article

Save Article

Given an array, arr[] and integer K, the task is to find the maximum number of non-overlapping subsets such that the sum of the subsets is strictly greater than K when you may also change the value of each element to the maximum value of the particular subset.

Examples:

Input: arr[]= {90, 80, 70, 60, 50, 100}, K = 180
Output: 2

Input: arr[] = {3, 2, 1}, K = 8
Output: 1

Approach: To solve the problem follow the below idea:

In order to form a maximum number of subsets we need to form a sequence with a minimum number of elements as well as the sum of values of elements should be greater than K. We start forming subsequences with elements having maximum value and changing the rest of the element value to the maximum value in the same subsequence.

Follow the steps mentioned below to implement the idea:  

  • Sort the array arr[] in non-increasing order
  • Take a pointer i initially at 0.
  • Iterate over the array and form subset with arr[i] with minimum possible elements.
  • Check if the elements already used + the elements required (d/arr[i] +1) for forming the current subset is less than or equal to the total number of elements then increase the subset formed and move pointer i to the next index.
  • Else, a return number of subsequences is formed as there are not enough elements available to form more subsets.

Below is the implementation of the above approach:

C++

#include <bits/stdc++.h>

using namespace std;

  

int maximumSequence(vector<int>& arr, int K, int n)

{

  

    

    sort(arr.begin(), arr.end(), greater<int>());

  

    int i = 0;

    int sequence_formed = 0;

    int elements_required = 0;

  

    while (elements_required + (K / arr[i]) + 1 <= n) {

  

        

        sequence_formed += 1;

  

        

        

        

        elements_required += ((K / arr[i]) + 1);

  

        i++;

    }

  

    return sequence_formed;

}

  

int main()

{

    vector<int> power = { 90, 80, 70, 60, 50, 100 };

    int n = power.size();

  

    int k = 180;

  

    

    cout << maximumSequence(power, k, n);

}

Time Complexity: O(N * logN)
Auxiliary Space: O(1)

Related Articles:

 

Stay connected with us on social media platform for instant update click here to join our  Twitter, & Facebook We are now on Telegram. Click here to join our channel (@TechiUpdate) and stay updated with the latest Technology headlines. For all the latest Technology News Click Here 

Read original article here

Denial of responsibility! FineRadar is an automatic aggregator around the global media. All the content are available free on Internet. We have just arranged it in one platform for educational purpose only. In each content, the hyperlink to the primary source is specified. All trademarks belong to their rightful owners, all materials to their authors. If you are the owner of the content and do not want us to publish your materials on our website, please contact us by email – [email protected]. The content will be deleted within 24 hours.
Leave A Reply

Your email address will not be published.