我有一个表数组:
int[] tables = new int[9]
我想让这个数组中的每个 int 都是一张 table 可以容纳的人数。 int[9] 所以总共 10 个表。
如果我最多有 98 名玩家,我希望数组包含:
tables[0] = 10
tables[1] = 10
tables[2] = 10
tables[3] = 10
tables[4] = 10
tables[5] = 10
tables[6] = 10
tables[7] = 10
tables[8] = 9
tables[9] = 9
现在 ^ 的总和是 98。
数组的值一开始都是0,要相加到和为98,98也可以不同,有时是97、96等。 谢谢。
最佳答案
这是一个简单的循环,根据剩余的人数将玩家数量分配到 table 上。由于您希望第一组表格的计数更高,因此您总是向上舍入。
示例:3 张 table ,8 名玩家
第一个表获得 8/3 = 3
(向上舍入)
剩下 2 张 table ,5 名玩家
第二个表得到5/2 = 3
(四舍五入)
剩下 1 张 table ,2 名玩家
第三张表得到 2/1 = 2
结果:[3,3,2]
代码:
private static int[] buildTables(int noOfTables, int noOfPlayers) {
int[] tables = new int[noOfTables];
for (int i = 0, playersLeft = noOfPlayers; i < noOfTables; playersLeft -= tables[i++]) {
int tablesLeft = noOfTables - i;
tables[i] = (playersLeft + tablesLeft - 1) / tablesLeft; // round up
}
return tables;
}
测试
System.out.println(Arrays.toString(buildTables(3, 8)));
System.out.println(Arrays.toString(buildTables(9, 5)));
System.out.println(Arrays.toString(buildTables(9, 98)));
System.out.println(Arrays.toString(buildTables(10, 98)));
System.out.println(Arrays.toString(buildTables(10, 96)));
System.out.println(Arrays.toString(buildTables(10, 88)));
输出
[3, 3, 2]
[1, 1, 1, 1, 1, 0, 0, 0, 0]
[11, 11, 11, 11, 11, 11, 11, 11, 10]
[10, 10, 10, 10, 10, 10, 10, 10, 9, 9]
[10, 10, 10, 10, 10, 10, 9, 9, 9, 9]
[9, 9, 9, 9, 9, 9, 9, 9, 8, 8]
如果您没有执行 +tablesLeft - 1
来导致向上舍入,结果将是:
[2, 3, 3]
[0, 0, 0, 0, 1, 1, 1, 1, 1]
[10, 11, 11, 11, 11, 11, 11, 11, 11]
[9, 9, 10, 10, 10, 10, 10, 10, 10, 10]
[9, 9, 9, 9, 10, 10, 10, 10, 10, 10]
[8, 8, 9, 9, 9, 9, 9, 9, 9, 9]
关于java - 如何将数组的每个元素加1直到最大值(事先已知)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37823944/