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兄你的算法终于出来了哈,等你很久了哈!