现在的位置: 首页 > 综合 > 正文

32 通过交换使a元素的和与b元素的和]之间的差最小

2018年01月20日 ⁄ 综合 ⁄ 共 1239字 ⁄ 字号 评论关闭
/*
32.
有两个序列 a,b,大小都为 n,序列元素的值任意整数,无序;
要求:通过交换 a,b  中的元素,使[序列 a  元素的和]与[序列 b  元素的和]之间的差最小。
例如:
var a=[100,99,98,1,2, 3];
var b=[1, 2, 3, 4,5,40];

首先先计算a,b中元素和之间的差绝对值D,然后逐一的把a中的元素和b中的任一元素作比较,
如果它们交换后的差值绝对值Temp小于原来的值D,那么就把a,b交换,并重新计算a和b的绝对值,
反复的进行,直到a中任一的元素都不能和b中的任一元素交换为止。

*/
#include<iostream>
#include<stdio.h>
#include<math.h>
using namespace std;

int smallDif(int a[],int b[],int len)
{
	int i,j,temp,sumA=0,sumB=0,cha,f;
	
	for(i=0;i<len;i++)
		sumA+=a[i];
	for(i=0;i<len;i++)
		sumB+=b[i];
	cha=fabs(sumA-sumB);
	f=0;
	for(i=0;i<len;i++)
	{
		while(1)
		{
			for(j=0;j<len;j++)
			{
				temp=fabs((sumA-a[i]+b[j])-(sumB+a[i]-b[j]));
				if(temp<cha)
				{
					sumA+=b[j]-a[i];
					sumB+=a[i]-b[j];
					cha=temp;
					
					temp=a[i];
					a[i]=b[j];
					b[j]=temp;
					f=1;
					break;
				}
			}
			if(j>=len)
				break;
		}
		if(i==len-1&&f)
		{
			f=0;
			i=-1;
		}
	}
	return cha;
}

int main()
{
	int a[]={100,99,98,1,2,3};
	int b[]={1,2,3,4,5,40};
	int c[]={1,13,20,38};
	int d[]={6,7,28,29};
	
	int cha,i;
	cha=smallDif(a,b,6);
	cout << "A,B系列元素的最小差为:" << cha<<endl;
	cout<< "A系列元素为";  
    for (i=0;i<sizeof(a)/sizeof(a[0]);i++)  
        cout<<a[i]<< " ";  
    cout<<endl; 
    cout << "B系列元素为";  
    for (i=0;i<sizeof(b)/sizeof(b[0]);i++)  
        cout<<b[i]<< " ";  
    cout<<endl;  
	
	
	cha=smallDif(c,d,4);
	cout << "A,B系列元素的最小差为:" << cha<<endl;
	cout<< "A系列元素为";  
    for (i=0;i<sizeof(c)/sizeof(c[0]);i++)  
        cout<<c[i]<< " ";  
    cout<<endl; 
    cout << "B系列元素为";  
    for (i=0;i<sizeof(d)/sizeof(d[0]);i++)  
        cout<<d[i]<< " ";  
    cout<<endl; 
	
	return 0;
}

抱歉!评论已关闭.