- 论坛徽章:
- 0
|
从头到尾看了一遍,得到启发,不过至今楼主也没有公布正确结果,我也尝试搞了一个,考虑到数组处理和打印显示的方便,懒得用c来写这段代码,尝试用PHP来写了一段,经过各种测试案例没有发现失败。
代码如下:
- <?php
- //下面列举了三种前面常提到的特殊例子和一个通常情况下的数组例子,均进行了测试
- $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) { //如果有一个数字大于其他数字总和,简单处理
- 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; //两个数组各自和的差
- $min = abs($x); //差的绝对值
-
- $ch = false; //进行交换的开关
- $t = 0;
-
- for ($j=0;$j<$count;$j++) {
- $y = ($a[$i] - $b[$j]); //两个元素间的差
- $z = $x-$y; //数组和之差与元素差之间的差,不考虑正负
- $absz = abs($z); //得到绝对值,用绝对值比较
-
- if ($absz <= $min) {
- $ch = true;
- $min = $absz;
- $t = $j;
- }
- }
-
- if ($ch) { //找到$ai和$bj,进行交换
- $tmp = $a[$i];
- $a[$i] = $b[$t];
- $b[$t] = $tmp;
- }
- }
- }
- sort($a);
- sort($b);
- //分别打印输出重新分组后的$a和$b数组,以及各自的和
- echo "Sum(b) = ".array_sum($a)."\n";
- print_r($a);
- echo "Sum(b) = ".array_sum($b)."\n";
- print_r($b);
- ?>
复制代码
其实我的解题思路很简单:首先这道题可以认为是把2n个数进行均分成两组数,要求两组数的和尽可能接近。
从楼主的题目中可以看出,排序应该不是主要的,而如何进行交换是非常重要的,关键的就是ai和bj的确定问题。
这个里面可能会有两种情况,一种是所有的数字当中,有一个数字大于其他数字总和,这种情况很好处理,把2n个数字里面最小的0,n-2个加上最大的那个数字给a数组,剩下的为b数组即可,另外一种情况就是通常情况,没有一个数字绝对大。
[ 本帖最后由 toplee 于 2006-11-23 15:32 编辑 ] |
|