原题:有一序列a,大小为n,分为2部分,序列元素的值任意整形数,无序;

要求:通过交换a,b中的元素,使[序列a元素的和]与[序列b元素的和]之间的差最小,用python写。

#coding=utf-8
# 1.将两序列合并为一个序列,并排序,为序列Source
# 2.拿出最大元素Big,次大的元素Small
# 3.在余下的序列S[:-2]进行平分,得到序列max,min
# 4.将Small加到max序列,将Big加大min序列,重新计算新序列和,和大的为max,小的为min。
# Python代码
def mean(sorted_list):if not sorted_list:return(([],[]))big=sorted_list[-1]small=sorted_list[-2]big_list,small_list=mean(sorted_list[:-2])big_list.append(small)small_list.append(big)big_list_sum=sum(big_list)small_list_sum=sum(small_list)if big_list_sum>small_list_sum:return((big_list,small_list))else:return((small_list,big_list))
li=[5,5,9,9,1]
l =[4,7,7,8,5]
l.extend(li)
l.sort()
l1,l2=mean(l)
print l1,l2
print ('Distance:%s'%abs(sum(l1)-sum(l2)))
print ('-*'*40)
# 输出结果
# [4, 5, 5, 7, 9] [1, 5, 7, 8, 9]
# Distance:0

解题思路一:

1.列表合并排序,设两个空列表
2.最大值添加第一个列表
3.比较两个列表差,循环放入最小列表中

代码如下(Python2.7.5):

list1=[1,21,3,14]
list2=[8,4,5,7]
li=[]
lis3 = []
lis4 = []for i in list1:li.append(i)
for i in list2:li.append(i)li.sort()
sum1=sum(lis3)
sum2=sum(lis4)
i = len(li) - 1while i >= 0 :if sum1>=sum2:lis4.append(li[i])sum2=sum(lis4)else:lis3.append(li[i])sum1=sum(lis3)i-=1
if sum1>=sum2:cha = sum1-sum2
else:cha = sum2-sum1print lis3
print lis4
print sum1
print sum2
print cha

解题思路二:

假如最小数是负数,这样题目就很简单,代码如下:

li1=[1,21,3,14]
li2=[8,4,5,7]sourcelist=[]for i in li1:sourcelist.append(i)
for j in li2:sourcelist.append(j)
sourcelist.sort()size=len(sourcelist)/2sourcelist.sort()print sum(sourcelist[:size])-sum(sourcelist[size:])

假如最小值为正数,当前数组a和数组b的和之差为
    A = sum(a) - sum(b)
    a的第i个元素和b的第j个元素交换后,a和b的和之差为
    A' = sum(a) - a[i] + b[j] - (sum(b) - b[j] + a[i])
           = sum(a) - sum(b) - 2 (a[i] - b[j])
           = A - 2 (a[i] - b[j])
    设x = a[i] - b[j]
    |A| - |A'| = |A| - |A-2x|
    
    |A'|= |A-2x|
    假设A > 0,
    当x 在 (0,A)之间时,做这样的交换才能使得交换后的a和b的和之差变小,x越接近A/2效果越好,
    如果找不到在(0,A)之间的x,则当前的a和b就是答案。
    所以算法大概如下:
    在a和b中寻找使得x在(0,A)之间并且最接近A/2的i和j,交换相应的i和j元素,重新计算A后,重复前面的步骤直至找不到(0,A)之间的x为止。

def change(llist, rlist):r = lenth - 1tflag = 1global flagglobal chawhile r >= 0 and tflag:for l in range(lenth):if ((rlist[r] - llist[l]) * 2 <= cha and rlist[r] > llist[l]):rlist[r], llist[l] = llist[l], rlist[r]rlist.sort()llist.sort()cha = sum(rlist) - sum(llist)tflag = 0breakelse:r -= 1if (r < 0):flag = 0return (llist, rlist)if (__name__ == '__main__'):li1=[1,21,3,14]li2=[8,4,5,7]sourcelist=[]for i in li1:sourcelist.append(i)for j in li2:sourcelist.append(j)sourcelist.sort()lenth = len(sourcelist) / 2llist = sourcelist[:lenth]rlist = sourcelist[lenth:]cha = sum(rlist) - sum(llist)flag = 1while flag:(llist, rlist) = change(llist, rlist)print llist, sum(llist)print rlist, sum(rlist)print cha



有两个序列a,b,大小都为n,序列元素的值任意整数,无序;要求:通过交换a,b中的元素,使[序列a元素的和相关推荐

  1. 笛卡尔树 (25 分)笛卡尔树是一种特殊的二叉树,其结点包含两个关键字K1和K2。首先笛卡尔树是关于K1的二叉搜索树,即结点左子树的所有K1值都比该结点的K1值小,右子树则大。其次所有结点的K2关键字

    立志用最少的代码做最高效的表达 笛卡尔树是一种特殊的二叉树,其结点包含两个关键字K1和K2.首先笛卡尔树是关于K1的二叉搜索树,即结点左子树的所有K1值都比该结点的K1值小,右子树则大.其次所有结点的 ...

  2. 这两年亚马逊创业都是一个非常火热的话题

    这两年亚马逊创业都是一个非常火热的话题,仿佛只要加入亚马逊创业就可以躺赚. 我想说的是,亚马逊毕竟是一门生意.既然是生意就会有盈亏.在亚马逊这门生意里面,别人的经验不具备参考价值. 首先,大家的目标不 ...

  3. java 时间字符串比较大小_java中如何比较两个时间字符串的大小

    思路: 先都转换成日期.然后再用毫秒数进行比较. 下面是简单的例子: function tab(date1,date2){ var oDate1 = new Date(date1); var oDat ...

  4. 魅族16Android版本,魅族16/16 Plus再曝光:大小都有骁龙845版本

    [TechWeb报道]6月21日消息,魅族15系列机型作为黄章口中的"小试牛刀"之作,确实在各方面的表现上都中规中矩,确实没有特别突出的亮点,而黄章也,魅族16才是其全力打造的真旗 ...

  5. PPT中添加位置和大小都一致的图片的方法

    我们制作PPT的时候,有时需要在多张PPT中的同一位置,放一张或者多张图片,并且要求这些图片在各个PPT中的位置和大小都是一致的. 实际情况是,我们所使用的图片很可能是不一样大小的.如果在PowerP ...

  6. 计算 java_两种计算Java对象大小的方法(转)

    原文:http://blog.csdn.net/iter_zc/article/details/41822719 另一篇类似文章:http://www.cnblogs.com/magialmoon/p ...

  7. 聊聊JVM(三)两种计算Java对象大小的方法

    普通对象的结构如下,按64位机器的长度计算 1. 对象头(_mark), 8个字节 2. Oop指针,如果是32G内存以下的,默认开启对象指针压缩,4个字节 3. 数据区 4.Padding(内存对齐 ...

  8. 快两年的时间,我都干了啥

    ‍‍ ‍‍大家好,我是写代码的篮球球痴 这是一篇总结性的文章,主要是总结这一年多快两年的时间,我都在做了些什么. 公司名字我就不说了,知道的人一眼就知道了. 我们是一家智能家居的公司. 提到智能家居, ...

  9. Java中对两个对象进行比较大小

    在Java中要想对两个对象进行比较大小,需要实现Comparable接口或Comparator接口.String类型的值之所以可以比较大小(汉字根据ANSI值的大小进行比较),是因为String类实现 ...

最新文章

  1. RHEL6.3安装vsftpd
  2. inline函数包涵static变量,调用时是否会有多份拷贝
  3. django-TDD
  4. libxml中用到的Xpath语法说明
  5. 每日程序C语言31-auto的使用
  6. Ubuntu10.10的网络配置
  7. POJ 2395 Out of Hay
  8. 深度学习——用神经网络解决非线性问题
  9. 常用排序算法及其实现
  10. Android 给TextView中的字体加上“中间线”
  11. 51nod 1101 换零钱 【完全背包变形/无限件可取】
  12. HTTPS加密解密过程
  13. 如何实现实时文本过滤
  14. 创建JSON集合使用JSONArray.fromObject 转化后得到的jsonArray集为空?
  15. 关于unity,Player打包面板的信息(上)
  16. 计算机专业口号 十六个字,霸气押韵16字班级口号(精选100句)
  17. matlab两个力的合成与分解,[转帖]小波图像分解与合成(例子) - Matlab讨论区 - 振动论坛 动力学,噪声 -......
  18. Spring Boot整合MyBatis框架(完整的注解版)
  19. 电子元器件封装获取方法
  20. 实例讲解PMP相关方参与度评估矩阵

热门文章

  1. 【技术博客-总览--重要】
  2. 从github上克隆hibernate项目
  3. 微信公众号--相关资料
  4. (翻译)Google Guava Cache
  5. android第二十步摄像
  6. 从Ubuntu12.04LTS到Foreda19再到Foreda8
  7. 数据库中的null和c#中的null
  8. mysql Access denied for user root@localhost错误解决方法总结
  9. MySQL 引擎特性 · InnoDB Buffer Pool
  10. C语言 scanf()和gets()函数的区别