/*有兩個陣列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] - (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為止。
*/把演算法大概實現了一下,程式如下:
1int
test(
float
a, float
b, intn)2
2425
if(suma
>=
sumb)
29else
30sum_diff
=sumb
-suma;
3132
temp1
=sum_diff/2
;33temp2
=temp1;
34tempi =0
;35tempj =0
;
3637
//找出a,b間差值最接近sum_diff/2的那一對數
38if
(flag_sum ==1
)52}53
else59}
60}61}
62}63else77}
78else84}
85}86}
87}8889
if(flag_num ==0
)90break;91
92temp
=a[tempi];
93a[tempi]
=b[tempj];
94b[tempj]
=temp;
9596
flag_num =0
;97flag_sum =0
;98}99
100for(i=
0; i
<
n;i++
)101
printf(
"%f/t
",a[i]);
102103
printf("/n
");104105
for(i=0
; i
<
n;i++
)106
printf(
"%f/t
",b[i]);
107108
printf("/n
");
109110
return0;
111}
112113
114int
main(
intargc,
char
*argv)
115;
118floatb[3
] =;119
120test(a, b, 3);
121122
return0;
123}
124
1int
test(
float
a, float
b, intn)2
2425
if(suma
>=
sumb)
29else
30sum_diff
=sumb
-suma;
3132
temp1
=sum_diff/2
;33temp2
=temp1;
34tempi =0
;35tempj =0
;
3637
//找出a,b間差值最接近sum_diff/2的那一對數
38if
(flag_sum ==1
)52}53
else59}
60}61}
62}63else77}
78else84}
85}86}
87}8889
if(flag_num ==0
)90break;91
92temp
=a[tempi];
93a[tempi]
=b[tempj];
94b[tempj]
=temp;
9596
flag_num =0
;97flag_sum =0
;98}99
100for(i=
0; i
<
n;i++
)101
printf(
"%f/t
",a[i]);
102103
printf("/n
");104105
for(i=0
; i
<
n;i++
)106
printf(
"%f/t
",b[i]);
107108
printf("/n
");
109110
return0;
111}
112113
114int
main(
intargc,
char
*argv)
115;
118floatb[3
] =;119
120test(a, b, 3);
121122
return0;
123}
124
交換兩個陣列使兩個陣列和的差最小
有兩個陣列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 ...
交換兩個陣列的元素,使兩個陣列和的差最小
前些時候面試碰到的題目 有兩個有序正整數陣列array1 n array2 m 通過交換兩陣列的元素,使兩個陣列的和最接近。基本演算法思路 每次從array1 array2選擇出一對能使交換後得array1和與array2和的差值變小的組合array1 i array2 j 作交換 直到對任意組合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...