- 論壇徽章:
- 0
|
從頭到尾看了一遍,得到啟發(fā),不過至今樓主也沒有公布正確結(jié)果,我也嘗試搞了一個,考慮到數(shù)組處理和打印顯示的方便,懶得用c來寫這段代碼,嘗試用PHP來寫了一段,經(jīng)過各種測試案例沒有發(fā)現(xiàn)失敗。
代碼如下:
- <?php
- //下面列舉了三種前面常提到的特殊例子和一個通常情況下的數(shù)組例子,均進(jìn)行了測試
- $a = array(1,0,3);
- $b = array(1,2,20);
- $a = array(3,5,6,7,13,14);
- $b = array(1,3,7,8,10,17);
- $a = array(11,12,8,91);
- $b = array(1,2,17,100);
- $a = array(1,7,3,343,43,23,2323,454,5,5656,56,565,43,41,23,2,0,0,1);
- $b = array(10,15,4,454,45,76,787,989,67,4545,65,566,2,343,3,4,2,4,0);
- $count = count($a);
- $c = array_merge($a,$b);
- sort($c);
- $sum = array_sum($c);
- $max = $c[$count*2-1];
- if ($max >= $sum/2) { //如果有一個數(shù)字大于其他數(shù)字總和,簡單處理
- for($i=0;$i<($count-1);$i++) {
- $a[$i] = $c[$i];
- $b[$i] = $c[$count-1+$i];
- }
- $a[$count-1] = $max;
- $b[$count-1] = $c[$count*2-2];
- } else { //通常情況
- for ($i=0;$i<$count;$i++) {
- $suma = array_sum($a);
- $sumb = array_sum($b);
-
- $x = ($suma - $sumb)/2; //兩個數(shù)組各自和的差
- $min = abs($x); //差的絕對值
-
- $ch = false; //進(jìn)行交換的開關(guān)
- $t = 0;
-
- for ($j=0;$j<$count;$j++) {
- $y = ($a[$i] - $b[$j]); //兩個元素間的差
- $z = $x-$y; //數(shù)組和之差與元素差之間的差,不考慮正負(fù)
- $absz = abs($z); //得到絕對值,用絕對值比較
-
- if ($absz <= $min) {
- $ch = true;
- $min = $absz;
- $t = $j;
- }
- }
-
- if ($ch) { //找到$ai和$bj,進(jìn)行交換
- $tmp = $a[$i];
- $a[$i] = $b[$t];
- $b[$t] = $tmp;
- }
- }
- }
- sort($a);
- sort($b);
- //分別打印輸出重新分組后的$a和$b數(shù)組,以及各自的和
- echo "Sum(b) = ".array_sum($a)."\n";
- print_r($a);
- echo "Sum(b) = ".array_sum($b)."\n";
- print_r($b);
- ?>
復(fù)制代碼
其實我的解題思路很簡單:首先這道題可以認(rèn)為是把2n個數(shù)進(jìn)行均分成兩組數(shù),要求兩組數(shù)的和盡可能接近。
從樓主的題目中可以看出,排序應(yīng)該不是主要的,而如何進(jìn)行交換是非常重要的,關(guān)鍵的就是ai和bj的確定問題。
這個里面可能會有兩種情況,一種是所有的數(shù)字當(dāng)中,有一個數(shù)字大于其他數(shù)字總和,這種情況很好處理,把2n個數(shù)字里面最小的0,n-2個加上最大的那個數(shù)字給a數(shù)組,剩下的為b數(shù)組即可,另外一種情況就是通常情況,沒有一個數(shù)字絕對大。
[ 本帖最后由 toplee 于 2006-11-23 15:32 編輯 ] |
|