我正在尝试解决这个问题:
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
然而我却不知道这是错误的行为。 也许有人可以建议一个好的数据结构和启发式来解决这个任务?
顺便说一下,任务的第二部分意味着招募的参数可以改变(增加),我们应该改革团队以获得最大化。但首先要至少先解决。 将不胜感激!答案 0 :(得分:2)
使用本地优化器可以解决此问题:
首先将招募人员随机分配到两个大小相同的小组中,并按照他们的效率增益对其进行排序。如果将新兵移动到另一组,效率的提高就是效率的提高。对于向导组中的新员工,这是strength - ability
;对于另一组,则相反。
然后,迭代交换两个新兵(每组一个)直到不再有可能进行改进。找到交换候选人很容易:只需要获得效率最高的两位候选人。如果效率增益之和变为负值,则找到最佳分配。