binghc 发表于 2011-9-16 22:13:09

回复 39# tryhi


与其我直接告诉你要怎么怎么互换数据,还让你这么纠结

我还是把问题从数学模型上抽象到生活中来,你自己分析题目,自己爱怎么换就怎么换,只要最后能把

那小岛上的金子都拿走,那你就成功了,实在不能拿走,尽可能的多拿走些,那你也离成功不远了

{:face (301):}

tryhi 发表于 2011-9-16 22:18:28

回复 47# binghc


    都说我明白啦,垂直互换没意义是不?1.只需说“是”还是“不是”,2.我的源码正不正确

learn321 发表于 2011-9-16 22:20:41

回复tryhi
非同一列的互换是有意义的,可能说垂直互换容易让人误解
xms77 发表于 2011-9-16 21:11 http://www.autoitx.com/images/common/back.gif[/
   

这个题确实有点儿意思,开始也没有理解,xms77兄 提醒的好!

binghc 发表于 2011-9-16 22:28:44

回复 48# tryhi


都说我明白啦,垂直互换没意义是不?1.只需说“是”还是“不是”,2.我的源码正不正确
    呵呵~那就当我多嘴了
首先恭喜你是第一个给出算法的人

至于代码正不正确,这没有什么正不正确的,只要出来的结果就可以了,看看每列是不是很接近平均值就可以了。如果是,那你的代码就是没问题的

但是有个问题还真得说说,你的计算结果总共有1293个数字,比原来多了3个,检查检查

tryhi 发表于 2011-9-16 22:34:44

回复 50# binghc


    你不会不会把总计那行也算进去啊,没多没少啊

binghc 发表于 2011-9-16 22:39:27

回复 51# tryhi


    哦~看错看错,不好意思,说明你的算法没问题

现在如果是4个人,5个人,应该没也没什么问题吧?

binghc 发表于 2011-9-16 22:46:20

本帖最后由 binghc 于 2011-9-16 22:47 编辑

回复 51# tryhi


       3列会了, 4列5列,肯定没问题,你的代码我看了,就是针对3列写的

好的算法一般力求降低耦合性,增强通用性。有兴趣的写一下,怕麻烦就算了



其他高手继续……

tryhi 发表于 2011-9-16 22:46:52

回复tryhi


    哦~看错看错,不好意思,说明你的算法没问题

现在如果是4个人,5个人,应该没也没 ...
binghc 发表于 2011-9-16 22:39 http://www.autoitx.com/images/common/back.gif

不过现在算法设计中只考虑了三,而且还不确定能不能计算出最优解,不过根据这个思路改成N行N列也是比较简单的,但这个思路究竟是不是能得到最优解这个我还不是很确定。因为只考虑了相邻两列,期待高人出现

binghc 发表于 2011-9-16 22:52:44

回复 54# tryhi


    这种算法一般用在数据公正性分配比较多一点儿,一般对效率要求也不特别高,最重要的是能完成功能,相差个几分钟,没太大关系。当然你能让它跑的更快,那当然是好事儿

747957181 发表于 2011-9-17 02:07:12

路过
瞅一瞅

3mile 发表于 2011-9-17 15:21:49

嗯,没有找到好的算法.
给出个笨办法,也算为如此好的题目做下抛砖引玉的烂砖头吧,希望能引来数学高手.
#include <array.au3>

Local $arr =

$e=_ArrayToString($arr,"+")

Local $array, $sum

For $i = 0 To UBound($array) - 1
        Local $temp = ), Number($arr[$i * 3 + 1]), Number($arr[$i * 3 + 2])]
        $array[$i] = $temp
        $array[$i] = $temp
        $array[$i] = $temp
Next

_ArrayDisplay($array,"原始数据")
MsgBox(0, "总和", _sum($array, 0) & @CRLF & _sum($array, 1) & @CRLF & _sum($array, 2))
$AVG = Int(Execute($e)/3)

For $i = 0 To UBound($array) - 1
        $max = max($array[$i], $array[$i], $array[$i])
        $min = min($array[$i], $array[$i], $array[$i])
        $sum0 = _sum($array, 0)
        $sum1 = _sum($array, 1)
        $sum2 = _sum($array, 2)

        $max_sum = max($sum0, $sum1, $sum2)
        $min_sum = min($sum0, $sum1, $sum2)

        If $sum0 = $sum1 And $sum1 = $sum2 Then ExitLoop

        If Eval("sum"&$max_sum) > $AVG Then
                If Number($array[$i][$max_sum]) <= Number($array[$i][$min_sum]) Then ContinueLoop
                $temp = $array[$i][$max_sum]
                $array[$i][$max_sum] = $array[$i][$min_sum]
                $array[$i][$min_sum] = $temp
        EndIf
Next

_ArrayDisplay($array,"结果")
MsgBox(0, "结果&每列总和", _sum($array, 0) & @CRLF & _sum($array, 1) & @CRLF & _sum($array, 2))


Func _sum($array, $col)
        If UBound($array, 0) <> 2 Then Return SetError(0)
        Local $sum = 0
        For $i = 0 To UBound($array) - 1
                $sum += $array[$i][$col]
        Next
        Return $sum
EndFunc   ;==>_sum

Func Max($x, $y, $z)
        $x = Number($x)
        $y = Number($y)
        $z = Number($z)
        Local $index = 0;=
        If $y > $x Then
                $index = 2
                If $y > $z Then
                        $index = 1
                EndIf
        EndIf
       
        If $z > $x Then
                $index = 1
                If $z > $y Then
                        $index = 2
                EndIf
        EndIf
        Return $index
EndFunc   ;==>Max

Func min($x, $y, $z)
        $x = Number($x)
        $y = Number($y)
        $z = Number($z)
        Local $index = 0;=
        If $y < $x Then
                $index = 2
                If $y < $z Then
                        $index = 1
                EndIf
        EndIf
       
        If $z < $x Then
                $index = 1
                If $z < $y Then
                        $index = 2
                EndIf
        EndIf
        Return $index
EndFunc   ;==>min

pchome2000 发表于 2011-9-17 16:41:46

回复看一下,学习一下。。。。。。。。。{:face (327):}

kvisof 发表于 2011-9-17 18:42:55

什么东西,瞧一瞧

kvisof 发表于 2011-9-17 18:42:57

什么东西,瞧一瞧

binghc 发表于 2011-9-18 00:26:25

回复 57# 3mile


    3mile兄你的算法终于出来了哈,等你很久了哈!
页: 1 2 3 [4] 5
查看完整版本: 数据公正性分配算法Lv1【这题做了我两天两夜,现已达到极限,高手们继续】