算法题之两个数组和之差最小化

来源:互联网 发布:中山seo搜索排名优化 编辑:程序博客网 时间:2024/05/23 11:53
题目:有两个序列a,b,大小都为n,序列元素的值任意整数,无序;要求:通过交换a,b中的元素,使[序列a元素的和]与[序列b元素的和]之间的差最小。例如:   var a=[100,99,98,1,2, 3];var b=[1, 2, 3, 4,5,40];源码:#include<iostream>#include<string>using namespace std;int myfabs(int a){    if(a<0)       return 0-a;    else       return a;}void swap(int * a, int * b ,int i, int j){    a[i]=a[i]+b[j];    b[j]=a[i]-b[j];    a[i]=a[i]-b[j];}int sum(int *a ,int size){    int result=0;    for(int i=0;i<size;i++)       result+=a[i];    return result;}void equalize(int *a, int * b,int size){    int A= sum(a,size)-sum(b,size);    if(A<0)    {        equalize(b,a,size);        return;    }    else    {        int i,j;        int aindex=-1;        int bindex=-1;        int min=sum(a,size)+sum(b,size);        for(i=0;i<size;i++)           for(j=0;j<size;j++)           {               if(!(a[i]-b[j]>0&&a[i]-b[j]<A))                  continue;               if(myfabs(a[i]-b[j]-A/2)<min)               {                   min=myfabs(a[i]-b[j]-A/2);                   aindex=i;                   bindex=j;               }           }        if(aindex==-1&&bindex==-1)           return;        else        {            swap(a,b,aindex,bindex);            equalize(a,b,size);        }    }}void printStr(int * str, int n){    for(int i=0;i<n;i++)    {        cout<<str[i]<<" ";    }    cout<<endl;}int main(){    int a[6]={100,99,98,97,2,3};    int b[6]={1,2,3,4,5,6};    equalize(a,b,6);    printStr(a,6);    printStr(b,6);    cout<<sum(a,6)-sum(b,6);}

原创粉丝点击