【笔试题】数组

program2050 2008-11-16 10:01:00
两个int数组a,b,长度一致,无序,现通过交换两个数组中的元素,使得两个数组的和的差值最小。
比如说,int a[]={20,40},int b[]=(100,80},开始的时候数组差就是:(100+80)-(20+40)=120,通过交换a,b中的元素使得差值最小,该怎么交换呢?
...全文
377 30 打赏 收藏 转发到动态 举报
写回复
用AI写文章
30 条回复
切换为时间正序
请发表友善的回复…
发表回复
ysgzs 2011-10-16
  • 打赏
  • 举报
回复
至于吗?上面的哥们儿……

o(∩_∩)o...让一步海阔天空
  • 打赏
  • 举报
回复
不至于吧?27楼的哥们儿……

o(∩_∩)o...让一步海阔天空
  • 打赏
  • 举报
回复
什么呀?看看去
nicholasfly 2008-11-19
  • 打赏
  • 举报
回复
进来学习
program2050 2008-11-19
  • 打赏
  • 举报
回复
我觉得不正确,并且效率也不高,目前我觉得15楼的最好。[Quote=引用 23 楼 deyangcai 的回复:]
17楼的答案是真确的!
为了使运行时更清晰,下面是我稍微给他改动了一下

#include <iostream>
using namespace std;
int main( )
{
int i,j,n,m,c,x=0,y=0,t;
cout < <"请输入n的值" < <"n=";
cin>>n;
int *a =new int [n];
int *b =new int [n];
cout < <"输入数组a:" < <endl;
for(i=0;i <n;i++ )
{
cin>>a[i];
}
cout < <"输入数组b:" < <endl;
for(j=0;j <n;j++ )
{
cin>>b[j];…
[/Quote]
supkychen 2008-11-19
  • 打赏
  • 举报
回复
1.把两个数组分别排序并累加.
2.判断两个数组的差,用大数组的大数来交换小数组的小数(中间经过很多次的判断)
即:b和a的和 相差c.sum(b)-sum(a) = c.
则判断b的最大值-a的最小值是不是小于c,如果是,交换.c=c-max(b)+min(a),否就b下一位或a上一位.直到一方都遍历完为止.
deyangcai 2008-11-19
  • 打赏
  • 举报
回复
17楼的答案是真确的!
为了使运行时更清晰,下面是我稍微给他改动了一下

#include <iostream>
using namespace std;
int main( )
{
int i,j,n,m,c,x=0,y=0,t;
cout<<"请输入n的值"<<"n=";
cin>>n;
int *a =new int [n];
int *b =new int [n];
cout<<"输入数组a:"<<endl;
for(i=0;i<n;i++ )
{
cin>>a[i];
}
cout<<"输入数组b:"<<endl;
for(j=0;j<n;j++ )
{
cin>>b[j];
}
for(int h=0;h<n;h++)
{
x=a[h]+x;
}

for(int k=0;k<n;k++)
{
y=b[k]+y;
}
m=y-x;

if(m<0)
{
m=-m;
}
c=m;

for(i=0;i<n;i++ )
{
for(j=0;j<n;j++)
{
t=a[i];
a[i]=b[j];
b[j]=t;
x=0;
y=0;
for( h=0;h<n;h++)
{
x=a[h]+x;
}

for( k=0;k<n;k++)
{
y=b[k]+y;
}

m=y-x;

if(m<0)
{
m=-m;
}
if(m<c)
c=m;
}

}
cout<<"输出最小差值c:"<<c<<endl;
for(i=0;i<n;i++ )
{
for(j=0;j<n;j++)
{
t=a[i];
a[i]=b[j];
b[j]=t;
x=0;
y=0;
for( h=0;h<n;h++)
{
x=a[h]+x;
}

for( k=0;k<n;k++)
{
y=b[k]+y;
}

m=y-x;

if(m<0)
{
m=-m;
}
if(m==c)
{
cout<<"输出新数组a:"<<endl;
for(i=0;i<n;i++ )
cout<<a[i]<<" ";
cout<<endl;
cout<<"输出新数组b:"<<endl;
for(j=0;j<n;j++ )
cout<<b[j]<<" ";
cout<<endl;
}


}
}
delete []a;
delete []b;
return 0;
}
program2050 2008-11-19
  • 打赏
  • 举报
回复
感觉这个最好啦!
[Quote=引用 15 楼 zhy282289 的回复:]
只说下思路:
A,B两个数组,还有个中间数组C
将A,B中数放在c中并从大到小排好
最大放A,第二放B中,第三放B中,如果此时A中的和大于B中的和(就是最大的比第二,第三大的和大),第三大放在B中,否则放A中。
继续上面的比较。哪个先放满,余下的放在未满数组中。
应该就是这样了。。
[/Quote]
sc_valentine21 2008-11-17
  • 打赏
  • 举报
回复
(20+40)-(100+80)算不算呢,这样可以,那就简单了。排个序,小的一半减大的一半
就呆在云上 2008-11-17
  • 打赏
  • 举报
回复
先把两个数组从大到小排序,且求和
然后比较二者的差值为max
然后,从第一个一直到最后一个比较,如下:
如果交换这个两个数值刻意让新的数组的差值小于max就交换,然后继续
一直到最后
insmile 2008-11-17
  • 打赏
  • 举报
回复
先计算原始差值,排序,然后交换最大最小(为了减少交换次数),和原始差值比较(肯定减小,但不能变成负值);继续交换次大次小,继续比较,循环。。。。。。最优情况是两和相等
wryse 2008-11-17
  • 打赏
  • 举报
回复
需要保证交换后的两个数组长度仍然一致么?
cyj626 2008-11-17
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 toadzw 的回复:]
将和大的数组中最大值与和小的数组中的最小值交换
[/Quote]

有问题。。。。
zhy282289 2008-11-17
  • 打赏
  • 举报
回复
我的两个个数是一样的啊:不是说了如果哪个数组先放满了,余下的都放在那个没有满的数组吗!!
wudeshou82666这个不行,因为有一个数很大的话就不行了(比如说比其它的数的总和都大)
program2050 2008-11-17
  • 打赏
  • 举报
回复
怎么个交换法啊?[Quote=引用 4 楼 hqin6 的回复:]
C/C++ code

先排序:

对于a,按从小到大
对于b,按从大到小


然后交换到中间

然后再排序,再次交换

这样,直到俩差结果不变了为止!
[/Quote]
program2050 2008-11-17
  • 打赏
  • 举报
回复
试一试先。[Quote=引用 4 楼 hqin6 的回复:]
C/C++ code

先排序:

对于a,按从小到大
对于b,按从大到小


然后交换到中间

然后再排序,再次交换

这样,直到俩差结果不变了为止!
[/Quote]
ufouser 2008-11-17
  • 打赏
  • 举报
回复
如果不是定长数组,而是两个vector,那就是背包问题了
设两个数组中所有的数将起来为sum.
将所有的数,平分到两个vector中(不要求两个vector中的元素个数一样多),并且使得两个vector的各自元素值之和最接近,
就等价于从所有的数中,取出尽量多的数,使其和不大于sum/2.
==>0/1背包问题.
wudeshou82666 2008-11-17
  • 打赏
  • 举报
回复
思路:
数组A,B排序。
然后对两数组的数组元素相减
存到第三个数组
在第三个数组中找出正负相等或者最相近的,记录下标到vector <pair(i,j)>;
i代表需要交换的数组A的元素下标
j代表需要交换的数组B的元素下标
然后进行交换
wind1373290 2008-11-17
  • 打赏
  • 举报
回复
背包问题
wind1373290 2008-11-17
  • 打赏
  • 举报
回复

#include <iostream>
using namespace std;
int main( )
{
int i,j,n,m,c,x=0,y=0,t;
cin>>n;
int *a =new int [n];
int *b =new int [n];
cout<<"输入数组a:"<<endl;
for(i=0;i<n;i++ )
{
cin>>a[i];
}
cout<<"输入数组b:"<<endl;
for(j=0;j<n;j++ )
{
cin>>b[j];
}
for(int h=0;h<n;h++)
{
x=a[h]+x;
}

for(int k=0;k<n;k++)
{
y=b[k]+y;
}
m=y-x;

if(m<0)
{
m=-m;
}
c=m;

for(i=0;i<n;i++ )
{
for(j=0;j<n;j++)
{
t=a[i];
a[i]=b[j];
b[j]=t;
x=0;
y=0;
for( h=0;h<n;h++)
{
x=a[h]+x;
}

for( k=0;k<n;k++)
{
y=b[k]+y;
}

m=y-x;

if(m<0)
{
m=-m;
}
if(m<c)
c=m;
}

}
cout<<"输出最小差值c:"<<c<<endl;
for(i=0;i<n;i++ )
{
for(j=0;j<n;j++)
{
t=a[i];
a[i]=b[j];
b[j]=t;
x=0;
y=0;
for( h=0;h<n;h++)
{
x=a[h]+x;
}

for( k=0;k<n;k++)
{
y=b[k]+y;
}

m=y-x;

if(m<0)
{
m=-m;
}
if(m==c)
{
cout<<"输出新数组a:"<<endl;
for(i=0;i<n;i++ )
cout<<a[i]<<" ";
cout<<endl;
cout<<"输出新数组b:"<<endl;
for(j=0;j<n;j++ )
cout<<b[j]<<" ";
cout<<endl;
}


}
}
delete []a;
delete []b;
return 0;
}
加载更多回复(9)

64,282

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧