📜  用给定值覆盖最大数组元素

📅  最后修改于: 2021-04-26 07:37:54             🧑  作者: Mango

给定糖果总数“ X”,学生数量“ N”和数组“ arr”,其中包含为使学生满意而必须给予学生的确切糖果数量的值,其中arr[i]是使学生“我”开心的糖果的确切数量。任务是分发糖果,使最大程度的学生高兴。

例子:

Input : X = 70, arr = {20, 30, 10}
Output: 2
One optimal way of distribution is (20, 40, 10)
So, the number of happy students are 2.

Input: X = 10, arr = {20, 30, 10}
Output: 1
One optimal way of distribution is (0, 0, 10)
Only 1 student can be made happy in this case

方法:我们可以开始向那些对小糖果感到满意的学生提供糖果,从而最大程度地增加快乐学生的数量。
因此,我们根据糖果以升序对学生列表进行排序。然后,我们将简单地遍历数组并带学生,直到总和小于或等于糖果总数。

下面是上述方法的实现:

C++
// C++ implementation of the approach
# include
using namespace std;
  
// Function to find value for 
// covering maximum array elements
int maxArrayCover(vector a, int n, int x){
  
    // sort the students in 
    // ascending based on 
    // the candies 
    sort(a.begin(), a.end());
       
    // To store the number 
    // of happy students
    int cc = 0;
       
    // To store the running sum
    int s = 0;
    for (int i = 0; i < n; i++){
        s += a[i];
  
        // If the current student
        // can't be made happy
        if(s > x){
           break;
        }
  
        // increment the count 
        // if we can make the 
        // ith student happy
        cc += 1;
    }
       
    // If the sum = x 
    // then answer is n
    if(accumulate(a.begin(), a.end(), 0) == x){
        return n;
    }
    else{
        // If the count is
        // equal to n then 
        // the answer is n-1
        if(cc == n){
            return n-1;
        }
        else{
            return cc;
        }
    }
}
  
// Driver function
int main(){
  
    int n = 3;
    int x = 70;
    vector a = {10, 20, 30};
  
    printf("%d\n",maxArrayCover(a, n, x));
  
    return 0;
}
// This code is contributed 
// by Harshit Saini


Java
// Java implementation of the approach
  
import java.util.*;
  
class GFG{
  
    // Function to find value for 
    // covering maximum array elements
    public static int maxArrayCover(int[] a, int n, int x){
  
        // sort the students in 
        // ascending based on 
        // the candies 
        Arrays.sort(a);
           
        // To store the number 
        // of happy students
        int cc = 0;
           
        // To store the running sum
        int s = 0;
        for (int i = 0; i < n; i++){
            s += a[i];
  
            // If the current student
            // can't be made happy
            if(s > x){
               break;
            }
  
            // increment the count 
            // if we can make the 
            // ith student happy
            cc += 1;
        }
           
        // If the sum = x 
        // then answer is n
        if(Arrays.stream(a).sum() == x){
            return n;
        }
        else{
            // If the count is
            // equal to n then 
            // the answer is n-1
            if(cc == n){
                return n-1;
            }
            else{
                return cc;
            }
        }
    }
  
    // Driver function
    public static void main(String []args){
  
        int n   = 3;
        int x   = 70;
        int[] a = new int[]{10, 20, 30};
  
        System.out.println(maxArrayCover(a, n, x));
  
        System.exit(0);
    }
}
  
// This code is contributed 
// by Harshit Saini


Python3
# Python implementation of the approach
  
# Function to find value for 
# covering maximum array elements
def maxArrayCover(a, n, x):
  
    # sort the students in 
    # ascending based on 
    # the candies 
    a.sort()
       
    # To store the number 
    # of happy students
    cc = 0
       
    # To store the running sum
    s = 0 
    for i in range(n):
         s+= a[i]
            
         # If the current student
         # can't be made happy
         if(s > x):
             break
       
         # increment the count 
         # if we can make the 
         # ith student happy
         cc += 1
       
    # If the sum = x 
    # then answer is n
    if(sum(a) == x):
         return n
    else:
         # If the count is
         # equal to n then 
         # the answer is n-1
         if(cc == n):
            return n-1
         else:
            return cc
  
# Driver function
if __name__ == '__main__':
  
    n, x = 3, 70
    a    = [10, 20, 30]    
  
    print(maxArrayCover(a, n, x))


C#
// C# implementation of the approach
  
using System;
using System.Linq;
  
class GFG{
  
    // Function to find value for 
    // covering maximum array elements
    static int maxArrayCover(int[] a, int n, int x){
  
        // sort the students in 
        // ascending based on 
        // the candies 
        Array.Sort(a);
           
        // To store the number 
        // of happy students
        int cc = 0;
           
        // To store the running sum
        int s = 0;
        for (int i = 0; i < n; i++){
            s += a[i];
  
            // If the current student
            // can't be made happy
            if(s > x){
               break;
            }
  
            // increment the count 
            // if we can make the 
            // ith student happy
            cc += 1;
        }
           
        // If the sum = x 
        // then answer is n
        if(a.Sum() == x){
            return n;
        }
        else{
            // If the count is
            // equal to n then 
            // the answer is n-1
            if(cc == n){
                return n-1;
            }
            else{
                return cc;
            }
        }
    }
  
    // Driver function
    public static void Main(){
  
        int n   = 3;
        int x   = 70;
        int[] a = new int[]{10, 20, 30};
  
        Console.WriteLine(maxArrayCover(a, n, x));
    }
}
  
// This code is contributed 
// by Harshit Saini


PHP
 $x){
           break;
        }
  
        // increment the count 
        // if we can make the 
        // ith student happy
        $cc += 1;
    }
       
    // If the sum = x 
    // then answer is n
    if(array_sum($a) == $x){
        return $n;
    }
    else{
        // If the count is
        // equal to n then 
        // the answer is n-1
        if($cc == $n){
            return $n-1;
        }
        else{
            return $cc;
        }
    }
}
  
$n = 3;
$x = 70;
$a = array(10, 20, 30);
  
echo maxArrayCover($a, $n, $x);
  
// This code is contributed 
// by Harshit Saini 
?>


输出:
2

时间复杂度: O(N * log(N))
空间复杂度: O(N)