100題 32 兩個序列的和的差最小

2021-09-06 02:41:55 字數 2375 閱讀 1801

有兩個序列a,b,大小都為n,序列元素的值任意整數,無序;

要求:通過交換a,b 中的元素,使[序列a 元素的和]與[序列b 元素的和]之間的差最小。

例如:var a=[100,99,98,1,2, 3];

var b=[1, 2, 3, 4,5,40];

2023年3月23日更新

感謝lambda2fei同學的提醒,下面的介紹的貪心方法,對於有的測試用例不好用,正確的方法等我思考明白了之後再補上。  

————————————————————

這個題可以用遞迴的思想來解決:

首先將這兩個陣列合成乙個陣列,並按從小到大的順序排序,取出最大的和次大的。將剩餘的2n-2個元素遞迴分成兩個和的差最小的兩部分。這樣和比較小的加上最大的那個元素和和比較大的加上次大的元素將是整個序列的最小和差劃分,可以用數學歸納法來證明。

**如下(python):

def mean(sorted_list, list_b = ):

if list_b:

sorted_list.extend(list_b)

sorted_list.sort()

if not sorted_list:

return (, )

big_list,small_list = mean(sorted_list[:-2])

if sum(big_list) > sum(small_list):

return (big_list, small_list)

else:

return (small_list, big_list)

def main():

a = [100, 98, 99, 1, 2, 3]

b = [1, 2, 3, 4, 5, 40]

big, small = mean(a, b)

print(big)

print(small)

if __name__ == '

__main__':

main()

2023年4月11日更新

當陣列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 > 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 mean(a, b):

if sum(a) < sum(b):

array = a

a = b

b = array

diff_sum = sum(a) - sum(b)

loop = true

while loop:

loop = false

md = diff_sum / 2

for i in range(0, len(a)):

for j in range(0, len(b)):

x = a[i] - b[j]

if x < diff_sum and x > 0:

loop = true

if abs(x - diff_sum / 2) < md:

md = abs (x - diff_sum / 2)

mi = i

mj = j

if loop:

tmp = a[mi]

a[mi] = b[mj]

b[mj] = tmp

diff_sum = diff_sum - 2 * (b[mj] - a[mi])

if diff_sum < 0:

array = a

a = b

b = array

diff_sum = - diff_sum

def main():

a = [7, 9, 10]

b = [6, 2, 8]

mean(a, b)

print (a)

print (b)

if __name__ == '__main__':

main()

兩個集合的差

題目出自杭電hdu 集合的差 以屬於a而不屬於b的元素為元素的集合稱為a與b的差集,即找出a中有的,而b中沒的。思路 1.對輸入的a,b集合進行集合內排序.2.a的元素a1依次與b中比a小的元素比較。3.若b中沒有元素與a1相等,則累加標記變數f,並把a1輸出.4.進行a1元素的下乙個元素a2與b中...

32 求兩個序列的和的最小差值

題目 有兩個序列a,b,大小都為n,序列元素的值任意整數,無序 要求 通過交換a,b中的元素,使 序列a元素的和 與 序列b元素的和 之間的差最小。例如 var a 100,99,98,1,2,3 var b 1,2,3,4,5,40 解法一 假設序列a,b中元素的和為sum a和sum b。假設a...

求兩個時間的差

直接上 注 中的model.recenttime就是你自己要計算的時間 nsstring newtime model.recenttime substringtoindex 19 取特定的字串與系統給的格式匹配 nslog newtime newtime dateand日曆 nstimezone z...