将“人员”划分为两个相同规模的团队,以达到最大总效率

时间:2018-04-08 15:54:05

标签: algorithm data-structures heap segment-tree

我正在尝试解决这个问题:

The kingdome recruited n people. Recruit has two characteristics: ability 
power and strength. Recruits must be devided into two equal-size squads: 
warriors and wisards. Found separation with max efficiency level.  Efficiency 
of wizard is determined by ability-power, of warrior - by strength.

我的第一个想法是通过max parametr(或使用max_heap)对新兵进行排序,然后:

for recruit in sorted_recruits:
     if wisards_counter!=n/2 or warriors_counter!=n/2:
            if recruit.strength>recruit.ap:
                summ+=recruit.strength
                warriors_counter+=1
            elif recruit.strength<recruit.ap:
                summ+=recruit.ap
                wisards_counter+=1

然而我却不知道这是错误的行为。 也许有人可以建议一个好的数据结构和启发式来解决这个任务?

顺便说一下,任务的第二部分意味着招募的参数可以改变(增加),我们应该改革团队以获得最大化。但首先要至少先解决。 将不胜感激!

1 个答案:

答案 0 :(得分:2)

使用本地优化器可以解决此问题:

首先将招募人员随机分配到两个大小相同的小组中,并按照他们的效率增益对其进行排序。如果将新兵移动到另一组,效率的提高就是效率的提高。对于向导组中的新员工,这是strength - ability;对于另一组,则相反。

然后,迭代交换两个新兵(每组一个)直到不再有可能进行改进。找到交换候选人很容易:只需要获得效率最高的两位候选人。如果效率增益之和变为负值,则找到最佳分配。