最大化所选数组元素的总和,其值最多为 M
给定一个包含N个正数的数组arr[]和一个整数M 。任务是在arr[i] ≤ M时通过添加数组元素来最大化M的值。
注意:任何数组元素最多可以添加一次。
例子:
Input: arr[] = {3, 9, 19, 5, 21}, M = 10
Output: 67
Explanation: One way to getthe value is
M > 3; 3 is added to M and it becomes 10+3 = 13
M > 9; 9 is added to M and it becomes 13+9 = 22
M > 19; 19 is added to M and it becomes 22+19 = 41
M > 5; 5 is added to M and it becomes 41+5 = 46
M > 21; 21 is added to M and it becomes 46+21 = 67
Thus, M = 67 at the end.
Input: arr[] = {2, 13, 4, 19}, M = 6
Output: 12
Explanation: One way to get the value is
M > 4; 4 is added to M and it becomes 6+4 = 10
M > 2; 2 is added to M and it becomes 10+2 = 12
No other value in the array is smaller or equal to M.
Thus, M is 12 at the end.
方法:解决方案是基于排序的概念。请按照以下步骤操作:
- 首先,按升序对数组进行排序。
- 对于从0 到 N-1的每个索引i ,请执行以下操作:
- 如果M ≥ arr[i] ,则将arr[i]与M相加。
- 如果M< arr[i] ,停止迭代。
- 返回 M 的最终值作为答案。
下面是上述方法的实现。
C++
// C++ code to implement the approach
#include
using namespace std;
// Function to calculate
// the maximum value of M
// that can be obtained
int IsArrayHungry(int M, vector& arr)
{
// Sort the array in increasing order.
sort(arr.begin(), arr.end());
long long sum = M;
int N = arr.size();
for (int i = 0; i < N; i++) {
if (sum >= arr[i])
sum += arr[i];
else
break;
}
return sum;
}
// Driver code
int main()
{
vector arr{ 3, 9, 19, 5, 21 };
int M = 10;
int res = IsArrayHungry(M, arr);
cout << res;
return 0;
}
Java
// Java program for the above approach
import java.io.*;
import java.lang.*;
import java.util.*;
class GFG
{
// Function to calculate
// the maximum value of M
// that can be obtained
static int IsArrayHungry(int M, int arr[ ])
{
// Sort the array in increasing order.
Arrays.sort(arr);
int sum = M;
int N = arr.length;
for (int i = 0; i < N; i++) {
if (sum >= arr[i])
sum += arr[i];
else
break;
}
return sum;
}
// Driver code
public static void main (String[] args)
{
int arr[ ] = { 3, 9, 19, 5, 21 };
int M = 10;
int res = IsArrayHungry(M, arr);
System.out.print(res);
}
}
// This code is contributed by hrithikgarg03188.
Python3
# Python 3 code to implement the approach
# Function to calculate
# the maximum value of M
# that can be obtained
def IsArrayHungry(M, arr):
# Sort the array in increasing order.
arr.sort()
sum = M
N = len(arr)
for i in range(N):
if (sum >= arr[i]):
sum += arr[i]
else:
break
return sum
# Driver code
if __name__ == "__main__":
arr = [3, 9, 19, 5, 21]
M = 10
res = IsArrayHungry(M, arr)
print(res)
# This code is contributed by ukasp.
C#
// C# code to implement above approach
using System;
class GFG
{
// Function to calculate
// the maximum value of M
// that can be obtained
static int IsArrayHungry(int M, int []arr)
{
// Sort the array in increasing order.
Array.Sort(arr);
int sum = M;
int N = arr.Length;
for (int i = 0; i < N; i++) {
if (sum >= arr[i])
sum += arr[i];
else
break;
}
return sum;
}
// Driver Code:
public static void Main()
{
int []arr = { 3, 9, 19, 5, 21 };
int M = 10;
int res = IsArrayHungry(M, arr);
Console.WriteLine(res);
}
}
// This code is contributed by Samim Hossain Mondal.
Javascript
67
时间复杂度: O(N * logN)
辅助空间: O(1)