有两个序列a,b,大小都为n,序列元素的值任意整数,无序;要求:通过交换a,b中的元素,使[序列a元素的和
原题:有一序列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元素的和相关推荐
- 笛卡尔树 (25 分)笛卡尔树是一种特殊的二叉树,其结点包含两个关键字K1和K2。首先笛卡尔树是关于K1的二叉搜索树,即结点左子树的所有K1值都比该结点的K1值小,右子树则大。其次所有结点的K2关键字
立志用最少的代码做最高效的表达 笛卡尔树是一种特殊的二叉树,其结点包含两个关键字K1和K2.首先笛卡尔树是关于K1的二叉搜索树,即结点左子树的所有K1值都比该结点的K1值小,右子树则大.其次所有结点的 ...
- 这两年亚马逊创业都是一个非常火热的话题
这两年亚马逊创业都是一个非常火热的话题,仿佛只要加入亚马逊创业就可以躺赚. 我想说的是,亚马逊毕竟是一门生意.既然是生意就会有盈亏.在亚马逊这门生意里面,别人的经验不具备参考价值. 首先,大家的目标不 ...
- java 时间字符串比较大小_java中如何比较两个时间字符串的大小
思路: 先都转换成日期.然后再用毫秒数进行比较. 下面是简单的例子: function tab(date1,date2){ var oDate1 = new Date(date1); var oDat ...
- 魅族16Android版本,魅族16/16 Plus再曝光:大小都有骁龙845版本
[TechWeb报道]6月21日消息,魅族15系列机型作为黄章口中的"小试牛刀"之作,确实在各方面的表现上都中规中矩,确实没有特别突出的亮点,而黄章也,魅族16才是其全力打造的真旗 ...
- PPT中添加位置和大小都一致的图片的方法
我们制作PPT的时候,有时需要在多张PPT中的同一位置,放一张或者多张图片,并且要求这些图片在各个PPT中的位置和大小都是一致的. 实际情况是,我们所使用的图片很可能是不一样大小的.如果在PowerP ...
- 计算 java_两种计算Java对象大小的方法(转)
原文:http://blog.csdn.net/iter_zc/article/details/41822719 另一篇类似文章:http://www.cnblogs.com/magialmoon/p ...
- 聊聊JVM(三)两种计算Java对象大小的方法
普通对象的结构如下,按64位机器的长度计算 1. 对象头(_mark), 8个字节 2. Oop指针,如果是32G内存以下的,默认开启对象指针压缩,4个字节 3. 数据区 4.Padding(内存对齐 ...
- 快两年的时间,我都干了啥
大家好,我是写代码的篮球球痴 这是一篇总结性的文章,主要是总结这一年多快两年的时间,我都在做了些什么. 公司名字我就不说了,知道的人一眼就知道了. 我们是一家智能家居的公司. 提到智能家居, ...
- Java中对两个对象进行比较大小
在Java中要想对两个对象进行比较大小,需要实现Comparable接口或Comparator接口.String类型的值之所以可以比较大小(汉字根据ANSI值的大小进行比较),是因为String类实现 ...
最新文章
- RHEL6.3安装vsftpd
- inline函数包涵static变量,调用时是否会有多份拷贝
- django-TDD
- libxml中用到的Xpath语法说明
- 每日程序C语言31-auto的使用
- Ubuntu10.10的网络配置
- POJ 2395 Out of Hay
- 深度学习——用神经网络解决非线性问题
- 常用排序算法及其实现
- Android 给TextView中的字体加上“中间线”
- 51nod 1101 换零钱 【完全背包变形/无限件可取】
- HTTPS加密解密过程
- 如何实现实时文本过滤
- 创建JSON集合使用JSONArray.fromObject 转化后得到的jsonArray集为空?
- 关于unity,Player打包面板的信息(上)
- 计算机专业口号 十六个字,霸气押韵16字班级口号(精选100句)
- matlab两个力的合成与分解,[转帖]小波图像分解与合成(例子) - Matlab讨论区 - 振动论坛 动力学,噪声 -......
- Spring Boot整合MyBatis框架(完整的注解版)
- 电子元器件封装获取方法
- 实例讲解PMP相关方参与度评估矩阵