• 数据结构与算法面试题80道(32)


    32.

    有两个序列a,b,大小都为n,序列元素的值任意整数,无序;

    要求:通过交换a,b中的元素,使[序列a元素的和][序列b元素的和]之间的差最小。

    当前数组a和数组b的和之差为
       A = sum(a) - sum(b)

       a的第i个元素和b的第j个元素交换后,a和b的和之差为
       A' = sum(a) - a[i] + b[j] - (sum(b)- b[j] + a[i])
              = sum(a) - sum(b) - 2 (a[i] - b[j])
              = A - 2 (a[i] - b[j])

        设x= a[i] - b[j]
        |A| - |A'| = |A| - |A-2x|

        假设A> 0,
        当x在(0,A)之间时,做这样的交换才能使得交换后的a和b的和之差变小,
    x越接近A/2效果越好,
       如果找不到在(0,A)之间的x,则当前的a和b就是答案。

    #include<iostream>
    using namespace std;
    class RunClass{
        public:
            void BalanceArray(int array1[],int array2[],int n1,int n2);
    
        private:
            int sum(int array[],int n);
    };
    
    int RunClass::sum(int array[],int n){//计算数组和
        int sum=0;
        for(int i=0;i<n;i++){
            sum+=array[i];
        }
        return sum;
    }
    
    void RunClass::BalanceArray(int array1[],int array2[],int n1,int n2){
        if(n1!=n2) return;
    
        int *array=new int[n1];
        int sumValue=sum(array1,n1)-sum(array2,n2);
        if(sumValue<0){//比较两个数组和的大小,让array1>array2
            sumValue=-sumValue;
            array=array1;
            array1=array2;
            array2=array;
        }
    
        bool ifCycle=true;//控制循环
    
        while(ifCycle){
            ifCycle=false;
            for(int i=0;i<n1;i++)
                for(int j=0;j<n2;j++){
                    int itemValue=array1[i]-array2[j];
                    if(itemValue<sumValue&&itemValue>0){//如果存在交换后能使差变小的a,b
                        ifCycle=true;
                        int temp=array1[i];//交换它们
                        array1[i]=array2[j];
                        array2[j]=temp;
                        sumValue-=2*itemValue;//校准A,上面推的公式
                    }
                }
        }
    }
    
    int main(){
        int array1[]={1,2,3,4,5,6,7,81,9,90};
        int array2[]={3,9,2,8,7,1,6,11,13,7};
        RunClass a;
        a.BalanceArray(array1,array2,10,10);
    
        for(int i=0;i<10;i++)
            cout<<array1[i]<<" ";
        cout<<endl;
        for(int i=0;i<10;i++)
            cout<<array2[i]<<" ";
        cout<<endl;
        return 0;
    }
  • 相关阅读:
    宿主机无法访问CentOS7上Jenkins服务的解决办法
    415. Add Strings
    367. Valid Perfect Square
    326. Power of Three
    258. Add Digits
    231. Power of Two
    204. Count Primes
    202. Happy Number
    172. Factorial Trailing Zeroes
    171. Excel Sheet Column Number
  • 原文地址:https://www.cnblogs.com/wabi87547568/p/5275827.html
Copyright © 2020-2023  润新知