游泳混合泳中继时间仿真algorithm

我试图模拟这个网站页面的I / O

我的input表如下所示:

在这里输入图像说明

现在在从input表中取出值并按升序排列后,我在一个临时工作表中获得了这个值:

在这里输入图像说明

这是我的结果表看起来像:

在这里输入图像说明

现在我已经尝试过这种sorting过程后(没有添加代码sorting,因为它不是问题):

Set rng = Union(wTime.Range("D6:D25"), wTime.Range("F6:F25"), wTime.Range("H6:H25"), wTime.Range("J6:J25")) cnt1 = 1: cnt2 = 1: cnt3 = 1: cnt4 = 1 wTime.Range("A6:A25") = Empty 'Ticker For i = 1 To 20 bckStroke(i) = wTemp.Range("A" & i + 1).Value brstStroke(i) = wTemp.Range("C" & i + 1).Value btrFly(i) = wTemp.Range("E" & i + 1).Value frStyle(i) = wTemp.Range("G" & i + 1).Value wTime.Range("A6:A25") = Empty For Each cel In rng If cel.Column = 4 And cel.Value = bckStroke(i) And cel.Value <> 0 And Trim(wTime.Cells(cel.Row, 1)) <> "Y" And cnt1 < 6 Then wRes.Cells((cnt1 + 5 + (cnt1 - 1) * 2) - 1, 4) = wTime.Cells(cel.Row, 2) 'Athlete Name wRes.Cells(cnt1 + 5 + (cnt1 - 1) * 2, 4) = bckStroke(i) 'Time cnt1 = cnt1 + 1 wTime.Cells(cel.Row, 1) = "Y" End If If cel.Column = 6 And cel.Value = brstStroke(i) And cel.Value <> 0 And Trim(wTime.Cells(cel.Row, 1)) <> "Y" And cnt2 < 6 Then wRes.Cells((cnt2 + 5 + (cnt2 - 1) * 2) - 1, 6) = wTime.Cells(cel.Row, 2) 'Athlete Name wRes.Cells(cnt2 + 5 + (cnt2 - 1) * 2, 6) = brstStroke(i) 'Time cnt2 = cnt2 + 1 wTime.Cells(cel.Row, 1) = "Y" End If If cel.Column = 8 And cel.Value = btrFly(i) And cel.Value <> 0 And Trim(wTime.Cells(cel.Row, 1)) <> "Y" And cnt3 < 6 Then wRes.Cells((cnt3 + 5 + (cnt3 - 1) * 2) - 1, 8) = wTime.Cells(cel.Row, 2) 'Athlete Name wRes.Cells(cnt3 + 5 + (cnt3 - 1) * 2, 8) = btrFly(i) 'Time cnt3 = cnt3 + 1 wTime.Cells(cel.Row, 1) = "Y" End If If cel.Column = 10 And cel.Value = frStyle(i) And cel.Value <> 0 And Trim(wTime.Cells(cel.Row, 1)) <> "Y" And cnt4 < 6 Then wRes.Cells((cnt4 + 5 + (cnt4 - 1) * 2) - 1, 10) = wTime.Cells(cel.Row, 2) 'Athlete Name wRes.Cells(cnt4 + 5 + (cnt4 - 1) * 2, 10) = frStyle(i) 'Time cnt4 = cnt4 + 1 wTime.Cells(cel.Row, 1) = "Y" End If Next cel Next i 

我只是想知道最简单的逻辑来获得所需的结果后,按升序排列(请参阅临时表)应该很容易,但我似乎无法理解。

我现在知道的情况是:

  1. 每个团队应该有独特的游泳者(即每个团队有4个独特的名字)

  2. 游泳者也可以出现在其他队伍中,如果他有其他类别的最佳时间。 (例如马塞洛将会出现在前四名的球队中,因为他在所有四个类别中都是最好的时机)

  3. 最短时间的团队应该放在结果表的第一名。 我认为按升序sorting照顾这是从临时表单中select正确的游泳者的问题。

编辑:

4.继电器逻辑的前提: 获得所有的组合可能没有2个相同的string。 然后将它们从最小到最大sorting。 我会做以下几点:得到所有可能的组合和他们的总和与以下:*组合可能仍然是越野车,因为它可能是多less你可能有变数。 这只是描述过程的指南
在这里输入图像说明 在这里输入图像说明

 Sub Combinations() Dim i As Long, j As Long, k As Long, l As Long, m As Long, n As Long, o As Long, p As Long, q As Long Dim CountComb As Long, lastrow As Long Range("K2").Value = Now - 5 Application.ScreenUpdating = False CountComb = 0: lastrow = 6 For i = 1 To 6: For j = 1 To 5 For k = 1 To 6: For l = 1 To 6 If Not (i = j Or i = k Or i = l Or j = k Or j = l Or k = l) Then Range("K" & lastrow).Value = Range("A" & i).Value & "/" & _ Range("B" & j).Value & "/" & _ Range("C" & k).Value & "/" & _ Range("D" & l).Value lastrow = lastrow + 1 CountComb = CountComb + 1 End If Next: Next Next: Next Range("K1").Value = CountComb Range("K3").Value = Now + 21 Application.ScreenUpdating = True End Sub Function TimeSum(Persons As String, Chr As String) As Double Dim ArrayPersons() As String: ArrayPersons = Split(Persons, Chr) Dim SumOfTime As Double Dim ItemPerson As Variant Dim NumberRoutines As Long: NumberRoutines = 2 Const SheetData = "Sheet1" For Each ItemPerson In ArrayPersons SumOfTime = Sheets(SheetData).Columns(NumberRoutines).Find(ItemPerson).Offset(0, -1).Value + SumOfTime NumberRoutines = NumberRoutines + 2 Next ItemPerson TimeSum = SumOfTime End Function 

也许你可以更好的定义你想要做的事情,但是最后的编码能够引导你走上正确的道路。 再次想到,你可以在字典中取得组合。
[ 3] [ 2]