我遇到了一个问题,我需要一些聪明人的帮助。我想将 n 个玩家分成 m 个团队。每个玩家都有不同的游戏能力。能力由正整数或负整数表示。一个团队的总能力只是分配到该团队的人员的能力得分之和。
我的目标是找到总能力最大的团队和总能力最小的团队之间的最小可能差异。限制条件是每个球员都必须被安排在一个团队中,并且每个团队必须至少有一个成员。
例如,如果我有以下具有能力的球员:[1, 2, 3, 4, 5, 6, 7] 并想组成三支球队。因此,总能力最大的团队和总能力最小的团队之间的最小可能差异为 1。一种可能的解决方案是:
第 1 队:1 + 3 + 6 = 10
第 2 队:2 + 7 = 9
第 3 队:4 + 5 = 9
我尝试使用以下策略来划分玩家:
1.排序能力
2.每次将剩余能力最高的玩家分配到能力最低的组,直到没有玩家
这种策略适用于一些问题。这是我到目前为止的代码:
public int minDifference(int numTeams, int[] abilities) {
ArrayList<ArrayList<Integer>> teams = new ArrayList<ArrayList<Integer>>();
int[] teamSum = new int[numTeams];
for(int i = 0; i < numTeams; i++){
teams.add(new ArrayList<Integer>());
teamSum[i] = 0;
}
Arrays.sort(abilities);
for(int i = abilities.length - 1; i >= 0; i--){
int minSum = teamSum[0];
int minNum = 0;
for(int j = 1; j < numTeams; j++){
if(teamSum[j] < minSum){
minSum = teamSum[j];
minNum = j;
}
}
teams.get(minNum).add(abilities[i]);
teamSum[minNum] += abilities[i];
}
Arrays.sort(teamSum);
System.out.println(teamSum[numTeams - 1] - teamSum[0]);
return teamSum[numTeams - 1] - teamSum[0];
}
现在我被困住了。我的想法是比较两支球队。说 A 和 B。A 的玩家 Tom 和 B 的玩家 Jerry。如果 A - B = 10,并且 Tom - Jerry = 3;然后交换汤姆和杰瑞。所以现在 A - B = 4。并继续这样做。但是好像比较太多了(因为你还需要计算两队球员之间的差异),我不知道什么时候停止(意味着我怎么知道它是最小的)。