【发布时间】:2013-07-10 15:57:08
【问题描述】:
我遇到了一个问题,我需要一些聪明的 SO 的帮助。我想将 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 现在。并继续这样做。但是好像比较太多了(因为你还需要计算两队球员之间的差异),我不知道什么时候停止(意味着我怎么知道它是最小的)。
【问题讨论】:
-
对不起,如果问题不清楚。我想将n个玩家分成m个队,最小化能力最高的团队和能力最低的团队之间的能力差异。
-
您自己尝试过吗?如果是这样,你能分享它并解释你需要帮助的地方吗? SO 不是编码或算法服务,我们不是来解决您的问题,只是为了回答您的问题。
-
告诉我们what you have tried,我们可以为您提供帮助。我们不是代码编写服务(我们中有些人通过编写代码赚钱)。
-
“我想要 ..” 提示。一个问题可能以“如何……”开头,并且通常以“?”结尾。你提出的问题越清楚,得到回答的机会就越大。如果这是你的问题,请edit它进入问题。
-
你对数组的大小有限制吗?对于较小的数字,蛮力可能是合理的。否则,这可能是一个没有“精确”算法的优化问题。您的尝试(嗯,至少是您的描述)通常被称为“爬山”。这是 wikipedia 关于优化算法的参考:en.wikipedia.org/wiki/…。这里有一个类似的问题:stackoverflow.com/questions/14120729/…