交換兩個陣列的值,使其和的差值最小

2021-06-09 19:24:24 字數 1433 閱讀 9978

求解思路:

當前陣列

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

為止。/

演算法1.

將兩序列合併為乙個序列,並排序,為序列

source

2. 拿出最大元素

big,次大的元素

small

3. 在餘下的序列

s[:-2]

進行平分,得到序列

max,

min

4. 將

small

加到max

序列,將

big加大

min序列,重新計算新序列和,和大的為

max,小的為

min。

有兩個序列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。假設aa和bb分別為序列a,b中的元素,則交換aa,bb後序列的和變為sum_a-aa+bb,sum_b+aa-bb;兩序列的差為(sum_a-aa+bb)-(sum_b+aa-bb)=sum_a-sum_b-2*(aa-bb);

所以可以掃瞄序列a,b中的元素,找到使abs(sum_a-sum_b-2*(aa-bb))最小的兩個元素進行交換,重複此過程,直至兩序列的差無法減小。

bool swap2balance(int *pa, int *pb, int n)

return true;}

交換兩個數的值

include iostream.h 解法二 include iostream.h void swap int x,int y void swap int x,int y void main void main 請同學們想一下,哪乙個能實現數值交換!我來告訴大家,解法可以實現這個功能!解法一 他把a...

交換兩個陣列值使兩個陣列之差最小

有兩個序列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。假設aa和bb...

交換兩個陣列使兩個陣列和的差最小

有兩個陣列a,b,大小都為n,陣列元素的值任意整形數,無序 要求 通過交換a,b中的元素,使 陣列a元素的和 與 陣列b元素的和 之間的差最小。求解思路 當前陣列a和陣列b的和之差為 a sum a sum b a的第i個元素和b的第j個元素交換後,a和b的和之差為 a sum a a i b j ...