|
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件 ★ 免费下载 ★ ★ 使用帮助★
本帖最后由 一把小刀闯天下 于 2019-1-16 11:52 编辑
'好玩而已。修改了一下用时小于1s,完全可以接受,,,
Option Explicit
Sub test()
Dim arr, kk As Long, m As Long, n As Long, dic, t, p As Long, sum, a As Long, tt
Dim i1 As Long, i2 As Long, i3 As Long, i4 As Long, i5 As Long
Dim x As Long, y As Long, i As Long, j As Long, k As Long
tt = Timer
Set dic = CreateObject("scripting.dictionary")
arr = [a1].CurrentRegion.Offset(1)
ReDim crr(1 To 10 ^ 5, 1 To 8) As String
ReDim drr(1 To UBound(arr, 1), 1 To 10)
For i = 1 To UBound(arr, 1) - 1
For j = i To UBound(arr, 1) - 1
If arr(j, 3) <> arr(j + 1, 3) Then
For x = i To j - 1
For y = x + 1 To j
If arr(x, 2) > arr(y, 2) Then
For k = 1 To 4
t = arr(x, k): arr(x, k) = arr(y, k): arr(y, k) = t
Next
End If
Next y, x
ReDim brr(1 To 5, 1 To 20) As String, cnt(1 To 5) As Long
m = 1: n = 0: dic.RemoveAll
ReDim sum(65 To 69), mark(1 To 5) As Long
For k = i To j
n = n + 1: brr(Asc(left(arr(k, 2), 1)) - 64, n) = arr(k, 2)
If left(arr(k, 2), 1) <> left(arr(k + 1, 2), 1) Or arr(k, 3) <> arr(k + 1, 3) Then
t = Asc(left(arr(k, 2), 1)) - 64
cnt(t) = n: mark(t) = 1: n = 0
End If
dic(arr(k, 2)) = arr(k, 4)
t = Asc(left(arr(k, 2), 1))
sum(t) = sum(t) + 1
Next
For k = 1 To UBound(cnt)
If cnt(k) = 0 Then cnt(k) = 1
Next
t = 0
For i1 = 1 To cnt(1)
If dic(brr(1, i1)) = "对" Or mark(1) = 0 Then
For i2 = 1 To cnt(2)
If dic(brr(2, i2)) = "对" Or mark(2) = 0 Then
For i3 = 1 To cnt(3)
If dic(brr(3, i3)) = "对" Or mark(3) = 0 Then
For i4 = 1 To cnt(4)
If dic(brr(4, i4)) = "对" Or mark(4) = 0 Then
For i5 = 1 To cnt(5)
If dic(brr(5, i5)) = "对" Or mark(5) = 0 Then
t = t + 1
End If
Next
End If
Next
End If
Next
End If
Next
End If
Next
a = a + 1: kk = kk + cnt(1) * cnt(2) * cnt(3) * cnt(4) * cnt(5)
drr(a, 1) = arr(i, 3): drr(a, 2) = kk - p: drr(a, 3) = t: drr(a, 4) = drr(a, 2) - t
t = 0
For k = 6 To 10
drr(a, k) = sum(59 + k)
If drr(a, k) > 0 Then t = t + 1
Next
drr(a, 5) = t: p = kk
i = j: Exit For
End If
Next j, i
With [f2]
.Resize(UBound(arr, 1), UBound(drr, 2)).ClearContents
.Resize(a, UBound(drr, 2)) = drr
End With
Debug.Print Format(Timer - tt, "0.00s"), "组合数:" & kk
End Sub
|
评分
-
1
查看全部评分
-
|