题目描述:
有两个数组a,b,大小都为n,数组元素的值任意整型数,无序;
要求:通过交换a,b中的元素,使[数组a元素的和]与[数组b元素的和]之间的差最小。
在“结构之法,算法之道”博客上看到了此题,博文中也提出了相应解法,但是发现此方法有bug,这里给出一个清晰的算法思路:先合并两个数组,然后将其排序,然后在从大到小放入a,b数组中,规则是先放a,再放b,直到b中的元素总和大于等于a后,再放a中,以此类推。
具体代码如下:(注: 因为在VC6.0中编写,所以不支持C99标准,这里将数组的长度固定为5)
#include <iostream>
#include <algorithm>
using namespace std;
void process(int a[],int b[],int n)
{
int temp[10];
int i;
for(i=0;i<n;i++)
{
temp[i]=a[i];
temp[i+n]=b[i];
}
sort(temp,temp+n*2);//对数组进行排序,默认升序,从小到大
cout<<endl;
int cura=0,curb=0,suma,sumb=0;
//算法基本思想:将排序后的数组,按从大到小顺序放入a,b数组中,规则是先放a,再放b,
//直到b中的元素总和大于等于a后,再放a中,以此类推。
a[cura++]=suma=temp[9]; //先将最大元素放入a中
for(i=2*n-2;i>=0;i--)
{
if((suma>sumb&&curb < n))
{
b[curb]=temp[i];
sumb+=b[curb++];
}
else if(cura<n) //数组b中元素总和大于a中元素总和情况
{
a[cura]=temp[i];
suma+=a[cura++];
}
}
}
int main()
{
int a[5];
int b[5];
int i;
cout<<"a数组:";
for(i=0;i<5;i++)
{
cin>>a[i];
}
cout<<"b数组:";
for(i=0;i<5;i++)
{
cin>>b[i];
}
process(a,b,5);
cout<<"交换元素后a数组:";
for(i=0;i<5;i++)
cout<<a[i]<<" ";
cout<<endl;
cout<<"交换元素后b数组:";
for(i=0;i<5;i++)
cout<<b[i]<<" ";
cout<<endl;
return 0;
}
测试结果如下图:
cdx 2014.5.3 11:09