a元素的和b元素的和之间的差最小
来源:互联网 发布:caxa怎样编程 编辑:程序博客网 时间:2024/05/16 08:55
32.(数组、规划)
有两个序列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<cassert>
using namespace std;
void Swap(int *a,int *b)
{
*a=*a^*b;
*b=*a^*b;
*a=*a^*b;
}
int ABDiffMin(int *A,int *B,int length)
{
assert(A!=NULL&&B!=NULL&&length>0);
int Sa=0,Sb=0;
for (int i=0;i<length;i++)
{
Sa+=A[i];
Sb+=B[i];
}
int minDiff=abs(Sa-Sb);
int newDiff;
int k=0;
do
{
int swapIndexA,swapIndexB;
newDiff=minDiff;
for(i=0;i<length;i++)
{
for (int j=0;j<length;j++)
{
int tempDiff=abs(Sa-Sb-2*(A[i]-B[j]));
if (tempDiff<newDiff)
{
newDiff=tempDiff;
swapIndexA=i;
swapIndexB=j;
}
}
}
cout<<"Sa,Sb"<<Sa<<" "<<Sb<<endl;
cout<<"after:"<<endl;
for(i=0;i<length;i++)
{
cout<<A[i]<<" ";
}
cout<<endl;
for(i=0;i<length;i++)
{
cout<<B[i]<<" ";
}cout<<endl;
cout<<"newDiff"<<newDiff<<endl;
cout<<"minDiff"<<minDiff<<endl;
if(newDiff<minDiff)
{
minDiff=newDiff;
Sa=Sa-A[swapIndexA]+B[swapIndexB];
Sb=Sb-B[swapIndexB]+A[swapIndexA];
Swap(&A[swapIndexA],&B[swapIndexB]);
}
else
break;
} while (1);
return newDiff;
}
int main()
{
int A[]={100,99,98,1,2, 3};
int B[]={1, 2, 3, 4,5,40};
int length=sizeof(A)/sizeof(int);
cout<<"diff:"<<ABDiffMin(A,B,length)<<endl;
for(int i=0;i<length;i++)
{
cout<<A[i]<<" ";
}
cout<<endl;
for(i=0;i<length;i++)
{
cout<<B[i]<<" ";
}
return 0;
}
有两个序列a,b,大小都为n,序列元素的值任意整数,无序;
要求:通过交换a,b中的元素,使[序列a元素的和]与[序列b元素的和]之间的差最小。
例如:
var a=[100,99,98,1,2, 3];
var b=[1, 2, 3, 4,5,40];
思路一:迭代法。O(n^2)搜索时间,当然可以先排序,在用二分法查找另一元素,可将复杂度降为O(nlogn)
思路二:将a、b合为一个数组,然后任意取6个数字,和为S6,使得|S12-2*S6|最小
//coder:Lee,20120320#include<iostream>
#include<cassert>
using namespace std;
void Swap(int *a,int *b)
{
*a=*a^*b;
*b=*a^*b;
*a=*a^*b;
}
int ABDiffMin(int *A,int *B,int length)
{
assert(A!=NULL&&B!=NULL&&length>0);
int Sa=0,Sb=0;
for (int i=0;i<length;i++)
{
Sa+=A[i];
Sb+=B[i];
}
int minDiff=abs(Sa-Sb);
int newDiff;
int k=0;
do
{
int swapIndexA,swapIndexB;
newDiff=minDiff;
for(i=0;i<length;i++)
{
for (int j=0;j<length;j++)
{
int tempDiff=abs(Sa-Sb-2*(A[i]-B[j]));
if (tempDiff<newDiff)
{
newDiff=tempDiff;
swapIndexA=i;
swapIndexB=j;
}
}
}
cout<<"Sa,Sb"<<Sa<<" "<<Sb<<endl;
cout<<"after:"<<endl;
for(i=0;i<length;i++)
{
cout<<A[i]<<" ";
}
cout<<endl;
for(i=0;i<length;i++)
{
cout<<B[i]<<" ";
}cout<<endl;
cout<<"newDiff"<<newDiff<<endl;
cout<<"minDiff"<<minDiff<<endl;
if(newDiff<minDiff)
{
minDiff=newDiff;
Sa=Sa-A[swapIndexA]+B[swapIndexB];
Sb=Sb-B[swapIndexB]+A[swapIndexA];
Swap(&A[swapIndexA],&B[swapIndexB]);
}
else
break;
} while (1);
return newDiff;
}
int main()
{
int A[]={100,99,98,1,2, 3};
int B[]={1, 2, 3, 4,5,40};
int length=sizeof(A)/sizeof(int);
cout<<"diff:"<<ABDiffMin(A,B,length)<<endl;
for(int i=0;i<length;i++)
{
cout<<A[i]<<" ";
}
cout<<endl;
for(i=0;i<length;i++)
{
cout<<B[i]<<" ";
}
return 0;
}
- a元素的和b元素的和之间的差最小
- 数组a元素的和与数组b元素的和之间的差最小
- 有两个序列a,b,要求:通过交换a,b中的元素,使[序列a元素的和]与[序列b元素的和]之间的差最小。
- 序列a元素的和与序列b元素的和之间的差最小(32)
- 32 通过交换使a元素的和与b元素的和]之间的差最小
- 32 通过交换使a元素的和与b元素的和]之间的差最小
- 交换a,b中的元素,a序列的和 与 b序列的和 之间的差最小
- 通过交换a,b 中的元素,使[序列a 元素的和]与[序列b 元素的和]之间的差最小
- 【每日面试题】通过交换a,b 中的元素,使[序列a 元素的和]与[序列b 元素的和]之间的差最小
- 通过交换a,b+中的元素,使[序列a+元素的和]与[序列b+元素的和]之间的差最小。
- 通过交换a,b+中的元素,使[序列a+元素的和]与[序列b+元素的和]之间的差最小
- 通过交换a,b中的元素,使[序列a元素的和]与[序列b元素的和]之间的差最小
- 通过交换a,b中的元素,使[序列a元素的和]与[序列b元素的和]之间的差最小
- 通过交换a,b 中的元素,使[序列a 元素的和]与[序列b 元素的和]之间的差最小
- 通过交换a,b 中的元素,使[序列a 元素的和]与[序列b 元素的和]之间的差最小
- 经典算法之6:通过交换a,b中的元素,使[序列a元素的和]与[序列b元素的和]之间的差最小
- 微软算法100道题------通过交换a,b中的元素,使[序列a元素的和]与[序列b元素的和]之间的差最小
- 通过交换a,b中的元素,使[数组a元素的和]与[数组b元素的和]之间的差最小
- 修改text字体属性
- /etc/apache2/apache2.conf
- poj 3177 Redundant Paths
- 1083
- oracle 数组类型
- a元素的和b元素的和之间的差最小
- NSString+NSMutableString+NSValue+NSAraay用法汇总(很不错的哦)
- Oracle9i - move
- 动视解析现代战争3 成功因团队强
- 数字版《寄生前夜2》今日登陆P
- 【SqlServer】错误 0xc00470fe: 数据流任务: 产品级别对于 组件“源 - TestDB01$”(1) 而言不足
- Android 联系人数据库链接关系分析
- Objective-C中的常用数学常量宏及函数
- Android 4.0按键事件以及电源管理流程分析