我有一个可以由彼此竞争的用户组玩的游戏。这些团体的数量非常少,不到10人。玩家人数是数千人。
当用户购买票证时,会为他分配一个组。目前,将一个组分配给一个玩家是随机完成的,但这可能会导致一组中有很多玩家而其他玩家很少。
我遇到的问题是如何分配组号,使组具有可比较的大小。
答案 0 :(得分:2)
保持HashMap<Integer, List<Group>>
,键入相关群组的大小。每个人都从零成员支架开始。在您拥有的最小非空尺寸括号的顶部弹出一个组,将新成员添加到其中,然后将其推到下一个最大尺寸。
You get O(n)
创建它,O(1)
推送和弹出一个组,如果你保持缓存,你可以让O(1)
找到最小的组只要你当前的一个用完就打电话,找到下一个。
答案 1 :(得分:1)
这些组的某些子集目前具有最小尺寸。 (如果所有组都具有相同的大小,则可以是整组。)从这组最小尺寸组中,随机选择一个,并将新玩家添加到其中。
如果你从一开始就遵循这个策略,那么任何两个组的大小都不会超过1.这是可实现的最小差异大小差异。
答案 2 :(得分:1)
这样的事情怎么样:
GroupManager::AssignGroup(Player player)
{
groupAssignments[groupIndex].add(player);
groupIndex++;
if ( groupIndex == GROUP_MAX )
groupIndex == 0;
}