题目:有两个序列a,b,大小都为n,序列元素的值任意整形数,无序;要求:通过交换a,b中的元素,使[序列a元素的和]与[序列b元素的和]之间的差最小。
解题思路:
- 将两个list整合排序.
- 定义两个空列表larger smaller每次依次从sorted list里面取出两个元素,通过判断当前两个list的大小(sum(larger) 与 sum(smaller))将元素中较大放入较小的list中.
- larger中的每个元素依次与smaller中的每个元素比较,如果larger[i] > smaller[j] 并且0< larger[i] - smaller[j] < sum(larger) - sum(smaller), 则交换两元素.
code:
def first_swap(sorted_list):
larger, smaller = [], []
for i in range(0, len(sorted_list) - 1, 2):
if sum(larger) - sum(smaller) > 0:
larger.append(sorted_list[i])
smaller.append(sorted_list[i + 1])
else:
larger.append(sorted_list[i + 1])
smaller.append(sorted_list[i])
return (larger, smaller) if sum(larger) - sum(smaller) > 0\
else (smaller, larger)
def final_swap(larger, smaller):
d = sum(larger) - sum(smaller)
for i in range(len(larger)):
for j in range(len(smaller)):
itd = larger[i] - smaller[j]
if d > itd > 0:
larger[i], smaller[j] = smaller[j], larger[i]
d = sum(larger) - sum(smaller)
return larger, smaller
if __name__ == "__main__":
l3 = [1, 1, 2, 3, 29, 18]
l4 = [30, 210, 232, 12311, 12312, 1]
sorted_list = sorted(l3 + l4)
l1, l2 = first_swap(sorted_list)
print "The result of the fist swap:"
print l1
print l2
print "Difference value of the fist swap: %d" % (sum(l1) - sum(l2))
l1, l2 = final_swap(l1, l2)
print "\nThe result of final swap:"
print l1
print l2
print "Difference value: %d" % (sum(l1) - sum(l2))
输出结果:
The result of the fist swap:
[1, 2, 3, 30, 232, 12311]
[1, 1, 18, 29, 210, 12312]
Difference value of the fist swap: 8
The result of final swap:
[1, 1, 1, 29, 232, 12311]
[3, 2, 18, 30, 210, 12312]
Difference value: 0
输出的结果没问题,但是总感觉final_swap又哪里不妥,但是我又看不出来哪里不妥[哭笑脸]