📌  相关文章
📜  已排序数组的所有子序列的最小元素的总和

📅  最后修改于: 2021-05-04 11:54:09             🧑  作者: Mango

给定一个n个整数的排序数组A。任务是找到A的所有可能子序列的最小值之和。

注意:考虑到数字不会溢出。

例子:

方法:天真的方法是生成所有可能的子序列,找到它们的最小值并将它们相加得到结果。

高效的方法:假定对数组进行了排序,因此观察到最小元素出现2 n-1次,第二个最小元素出现2 n-2次,依此类推……让我们举个例子:

因此,遍历数组并将当前元素即arr [i] * pow(2,n-1-i)添加到总和中。

下面是上述方法的实现:

C++
// C++ implementation of the above approach
#include 
using namespace std;
  
// Function to find the sum
// of minimum of all subsequence
int findMinSum(int arr[], int n)
{
  
    int occ = n - 1, sum = 0;
    for (int i = 0; i < n; i++) {
        sum += arr[i] * pow(2, occ);
        occ--;
    }
  
    return sum;
}
  
// Driver code
int main()
{
    int arr[] = { 1, 2, 4, 5 };
    int n = sizeof(arr) / sizeof(arr[0]);
  
    cout << findMinSum(arr, n);
  
    return 0;
}


Java
// Java implementation of the above approach 
class GfG 
{
  
// Function to find the sum 
// of minimum of all subsequence 
static int findMinSum(int arr[], int n) 
{ 
  
    int occ = n - 1, sum = 0; 
    for (int i = 0; i < n; i++)
    { 
        sum += arr[i] * (int)Math.pow(2, occ); 
        occ--; 
    } 
  
    return sum; 
} 
  
// Driver code 
public static void main(String[] args) 
{ 
    int arr[] = { 1, 2, 4, 5 }; 
    int n = arr.length; 
  
    System.out.println(findMinSum(arr, n)); 
}
} 
  
// This code is contributed by Prerna Saini


Python3
# Python3 implementation of the 
# above approach
  
# Function to find the sum
# of minimum of all subsequence
def findMinSum(arr, n):
  
    occ = n - 1
    Sum = 0
    for i in range(n):
        Sum += arr[i] * pow(2, occ)
        occ -= 1
      
    return Sum
  
# Driver code
arr = [1, 2, 4, 5]
n = len(arr)
  
print(findMinSum(arr, n))
  
# This code is contributed 
# by mohit kumar


C#
// C# implementation of the above approach 
using System;
  
class GFG
{
      
// Function to find the sum 
// of minimum of all subsequence 
static int findMinSum(int []arr, int n) 
{ 
  
    int occ = n - 1, sum = 0; 
    for (int i = 0; i < n; i++) 
    { 
        sum += arr[i] *(int) Math.Pow(2, occ); 
        occ--; 
    } 
  
    return sum; 
} 
  
// Driver code 
public static void Main(String []args) 
{ 
    int []arr = { 1, 2, 4, 5 }; 
    int n = arr.Length; 
  
    Console.WriteLine( findMinSum(arr, n)); 
}
} 
// This code is contributed by Arnab Kundu


PHP


输出:
29

注意:要查找已排序数组中所有子序列的最大元素总和,只需以相反的顺序遍历该数组并对Sum应用相同的公式即可。