我有一个用户数据库(带有编号分配)和一个Excel列表,列出了我成功进入两个数组的项目。一组用户,另一组来自Excel(任务)。我试图想出代表这种情况的逻辑:
DB中的用户可以使用数字0-5存在。基本上这表示他们在一周内休息了多少天,并帮助分解每个人可以获得的Excel范围中的项目数量,以便正确比例项目(在我使用布尔指示符指示包含或排除之前) 。例如:
User | Present #
-------------------
Jared | 0 'present daily
John | 0 'present daily
Mary | 1 'off 1 day
Tom | 5 'off rotation entirely
问题是:将这与他们应该获得的项目总数相关联的最佳方式是什么?
我希望Jared
和John
得到最多,Mary
少一点,Tom
永远不会被包含在内。假设我有50个项目。
我想到的一种方法是,在将名称循环到Excel中时,每次从数组顶部开始作为“传递”(在分配到Excel单元格时)进行计数。
Anyone with a 0 is never skipped through each pass Anyone with a 1 is skipped every 4th pass Anyone with a 2 is skipped every 3rd pass Anyone with a 3 is skipped every 2nd pass Anyone with a 4 is skipped every other pass Anyone with a 5 is never included (easy)
对于我的示例,始终会使用Jared
和John
,每四次传递将跳过Mary
,并且永远不会使用Tom
。
这有意义吗? 每隔N次捕获数组循环的最佳方法是什么? 我是否以正确的方式解决这个问题?
答案 0 :(得分:1)
为了避免大量循环以及这可能导致的延迟,我建议计算一个“需求因子”
根据可用性分配50个项目(在示例中)。可用性每天显示为0
完全显示为5
轮换,但反过来更容易使用这些内容:'off rotation'没有可用的资源,因此0
和'now daily'有所有工作日(?)可用,所以5
。
用户|现在#table将成为:
Jared 5 John 5 Mary 4 Tom 0 14
所以14个人日可以容纳50个项目,平均每人每天3.57个项目。假设一个项目不能拆分,即每人每天3项,超过8项。通过将(修订的)表值乘以INT(item_total / table-total),可以在一次通过中分配'3 each'。所以对于贾里德和约翰来说,结果是5x3 = 15,玛丽4x3 = 12。
虽然只有42个,但还有8个尚未分配。 3,3,2'额外'是显而易见的(导致18,18,14),但编程并不那么容易。我建议INT公式中有任何残差,然后使用它的结果+1(即这里4而不是3)接受20,20,16,0(6太多)的初步结果然后循环每个用户敲1关闭(如果可能的话),直到6人被击倒。
答案 1 :(得分:0)
这并不完全有意义,因为您似乎每周分配一个任务:
每个传球都不会跳过任何0的人
任何有1的人都会被第4次传递
每次第3次传球都会跳过任何2的人
每次第二次传球都会跳过任何有3的人
每隔一次传球都会跳过任何一个4的人
任何拥有5的人都不会被包括在内(简单)
但是,假设上述情况,您在个人TaskAssignmentsAttempted Mod (6 - Present#) = 0
时跳过用户。
也许你需要:
永远不会跳过任何0的人
任何一个1的人每5次传球被跳过
任何有2的人每5次传球被跳过两次
任何一个3的人每5次传球被跳过3次
任何一个4的人每5次传球被跳过4次
任何有5的人都会被跳过。
假设上述情况,当您的个人5 - Present#
小于其个人TaskAssignmentsAttempted Mod 5
时,您会跳过用户。
使用其中任何一个,您需要跟踪每个用户进行分配尝试的次数(成功与否)以及实际分配。