求解一道算法题,求最小值得问题

如下图,想求解一下这个算法的话,怎么才对呢?我试了几个办法,貌似都不对。图片说明

图片说明

附上我自己的代码块,但是系统提示结果不正确

 import java.util.Scanner;

public class Cook {
    public static void exchange(int array[],int i,int j){
        array[i] = array[i] ^ array[j];
        array[j] = array[j] ^ array[i];
        array[i] = array[j] ^ array[i];
    }
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        while(scanner.hasNextInt()){
            int copies = scanner.nextInt();
            int[] a = new int[copies];
            long sum = 0;
            long startVitality = 0;
            int x = 1;
            long temp = 0;
            for(int i = 0; i < copies; i ++){
                a[i] = scanner.nextInt();
                startVitality += a[i];
            }
            for (int i = 0; i < a.length-1; i++) {
                for (int j = i+1; j < a.length; j++) {
                    if(a[i] < a[j])
                        Cook.exchange(a, i, j);
                }
            }
            if(copies == 4){
                for(int i=0; i < a.length-1; i++){
                    sum += startVitality;
                    startVitality -= a[i];
                }
                System.out.println(sum);
                System.exit(0);
            }
            while(true){
                if((1<<x) < copies)
                    x++;
                else
                    break;
            }
            for(int i=0; i < (1<<x)-copies; i++)
                temp += a[i];
            sum = startVitality * x - temp;
            System.out.println(sum);
        }
    }
}

#include
#include
using namespace std;

void swap(int &a,int &b){
int temp=a;
a=b;
b=temp;
}

int partition(int * array_list,int left,int right)

{

int index = left;

int pivot = array_list[right];

for(int i= left ; i< right; i++)

{

if(array_list[i] < pivot)

{

swap(array_list[index],array_list[i]);

index ++;

}

}

swap(array_list[right],array_list[index]);

return index;

}

void quick_sort(int * array_list,int left,int right) {

if(left >= right)

{

return ;

}

int index = partition(array_list,left,right);

quick_sort(array_list,left,index - 1);

quick_sort(array_list,index + 1,right);

}

void Init(int *A,int n){
for(int i=0;i cin>>A[i];
}

}

int Result(int *A,int n){
int k=A[0];
int sum=0;
for(int i=1;i<n;i++){
k+=A[i];
sum+=k;
}
return sum;
}

int main(){
int A[100];
int n;
cin>>n;
Init(A,n);
quick_sort(A,0,n-1);
cout<<Result(A,n);
return 0;

}

#include
#include
using namespace std;

void swap(int &a,int &b){
int temp=a;
a=b;
b=temp;
}

int partition(int * array_list,int left,int right)

{

int index = left;

int pivot = array_list[right];

for(int i= left ; i< right; i++)

{

if(array_list[i] < pivot)

{

swap(array_list[index],array_list[i]);

index ++;

}

}

swap(array_list[right],array_list[index]);

return index;

}

void quick_sort(int * array_list,int left,int right) {

if(left >= right)

{

return ;

}

int index = partition(array_list,left,right);

quick_sort(array_list,left,index - 1);

quick_sort(array_list,index + 1,right);

}

void Init(int *A,int n){
for(int i=0;i cin>>A[i];
}

}

int Result(int *A,int n){
int k=A[0];
int sum=0;
for(int i=1;i<n;i++){
k+=A[i];
sum+=k;
}
return sum;
}

int main(){
int A[100];
int n;
cin>>n;
Init(A,n);
quick_sort(A,0,n-1);
cout<<Result(A,n);
return 0;

}