Excel精英培训网

 找回密码
 注册
数据透视表40+个常用小技巧,让你一次学会!
查看: 2123|回复: 8

中国式过马路

[复制链接]
发表于 2013-4-12 22:16 | 显示全部楼层 |阅读模式
本帖最后由 爱疯 于 2013-4-13 12:10 编辑





  1. Sub test()
  2.     Dim d As Object, A(), B(), C(), x, i&, j&, k%, s%, p%, q%


  3.     '指定每波人数
  4.     x = Application.InputBox("凑够多少人,就过马路:", "输入", 10, , , , , 1)
  5.     If x = 0 Then End


  6.     '初值
  7.     With Sheets("sheet1")
  8.         .Range("C:C").Clear
  9.         A = .Range("A1:C" & .Range("A65536").End(xlUp).Row).Value
  10.         A(1, 2) = "序号"
  11.         A(1, 3) = "第几批"
  12.     End With


  13.     '一人一行,建数组B
  14.     For i = 2 To UBound(A)
  15.         s = s + A(i, 2)
  16.     Next i
  17.     ReDim B(1 To s + 1, 1 To UBound(A, 2))
  18.     For j = 1 To UBound(B, 2)
  19.         B(1, j) = A(1, j)
  20.     Next j


  21.     '序号和第几批
  22.     s = 1
  23.     Set d = CreateObject("scripting.dictionary")
  24.     For i = 2 To UBound(A)
  25.         For j = 1 To A(i, 2)
  26.             s = s + 1
  27.             B(s, 1) = A(i, 1)
  28.             d(A(i, 1)) = d(A(i, 1)) + 1: B(s, 2) = d(A(i, 1))
  29.             B(s, 3) = (s - 2) \ x + 1
  30.         Next j
  31.     Next i
  32.     Set d = Nothing

  33.     '>>> 仅为测试效果,可注释
  34.     '样式
  35.     Columns("e:g").Clear
  36.     Range("e1").Resize(UBound(B), UBound(B, 2)) = B
  37.     '填色好查看
  38.     For i = 2 To UBound(B) Step x
  39.         Cells(i, "e").Resize(x, UBound(B, 2)).Interior.Color = _
  40.         RGB(Int(Rnd * 123) + 99, Int(Rnd * 123) + 99, Int(Rnd * 123) + 99)
  41.     Next i
  42.     '<<<

  43.     '把连续的人群作为一个单位
  44.     s = 1: p = 1
  45.     ReDim A(1 To UBound(B), 1 To UBound(B, 2))
  46.     For j = 1 To UBound(A, 2)
  47.         A(1, j) = B(1, j)
  48.     Next j
  49.     For i = 2 To UBound(A) - 1

  50.         '是否往数组A写入新元素
  51.         If B(i, 1) <> B(i + 1, 1) And B(i, 2) + 1 <> B(i + 1, 2) Or _
  52.            B(i, 3) <> B(i + 1, 3) Then
  53.             q = B(i, 2)   '当前的终点

  54.             '记录当前的范围
  55.             s = s + 1
  56.             A(s, 1) = B(i, 1)
  57.             A(s, 2) = p & "到" & q
  58.             A(s, 3) = B(i, 3)

  59.             p = B(i + 1, 2)   '下一个的起点
  60.             k = B(i + 1, 2)    '新起点
  61.         Else
  62.             k = p    '旧起点
  63.         End If

  64.         '倒数第2行时,就记录最后一个范围
  65.         If i = UBound(B) - 1 Then
  66.             s = s + 1
  67.             A(s, 1) = B(i + 1, 1)
  68.             A(s, 2) = k & "到" & B(i + 1, 2)
  69.             A(s, 3) = B(i + 1, 3)
  70.         End If
  71.     Next i

  72.     '最终输出
  73.     Columns("J:L").Clear
  74.     Range("J1").Resize(s, UBound(A, 2)) = A

  75. End Sub
复制代码
中国式过马路2.rar (12.47 KB, 下载次数: 24)
发表于 2013-4-12 22:24 | 显示全部楼层
回复

使用道具 举报

 楼主| 发表于 2013-4-12 22:26 | 显示全部楼层
wayy 发表于 2013-4-12 22:24
思路可以考虑规划求解

谢谢yy!
我几乎没用过规划求解,都忘光了,可以做出下图类似的结果么?
回复

使用道具 举报

发表于 2013-4-12 22:46 | 显示全部楼层
中国式过马路是团结的表现,{:912:}
回复

使用道具 举报

 楼主| 发表于 2013-4-12 22:55 | 显示全部楼层
hwc2ycy 发表于 2013-4-12 22:46
中国式过马路是团结的表现,

感觉像一种题型,所以希望学习一下{:021:}
回复

使用道具 举报

发表于 2013-4-16 10:38 | 显示全部楼层
呵呵,应该按运筹学的方法以做
回复

使用道具 举报

 楼主| 发表于 2013-4-16 10:40 | 显示全部楼层
向前冲 发表于 2013-4-16 10:38
呵呵,应该按运筹学的方法以做

这个。。。。咱没学过
运筹学是什么思路呀
回复

使用道具 举报

发表于 2013-6-11 10:05 | 显示全部楼层
过马路都可以这样了?水平真的太高了。
回复

使用道具 举报

发表于 2013-7-31 17:18 | 显示全部楼层
思路奇妙!很好!学习了!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|Archiver|Excel精英培训 ( 豫ICP备11015029号 )

GMT+8, 2024-4-29 04:20 , Processed in 0.317166 second(s), 9 queries , Gzip On, Yac On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表