算法:将y球放入x盒中,其中x <= y

时间:2012-04-09 20:06:43

标签: java algorithm

我在Android上开发应用时遇到了问题。但问题是:

x个框和y个球x <= y,我想分发球,将它们放在按顺序框内。例如:3盒; box Abox Bbox C - 以及5个球; ball 1ball 2ball 3ball 4ball 5

我需要的是将第一个球ball 1放在box A内,ball 5放在box C内,其他球在它们之间分配(无论如何一个盒子比其他盒子有更多的球。这是一个模拟问题的循环(缺少增量值):

int boxCount = 0; // first box is 0 and last box is x
int numOfBalls = y;
for(int i = 0; i < numOfBalls; i++, boxCount += ???)
{
    boxes.get(boxCount).add(balls.get(i));
}

我应该使用哪个等式代替???来解决问题?


修改

x <= y以来,这意味着:

  • 所有方框都不应为空。
  • 盒子的球数之间的差异不应超过1个。

EDIT2

in order,我的意思是:

A   B   C
---------
1   3   5
2   4

A   B   C
---------
1   2   3
4   5

4 个答案:

答案 0 :(得分:3)

您可以在第一个(int)n/k框中分配k-1个球,在最后一个框中分配其余的球。这将是最简单的代码。

这样:boxCount += (i % (numOfBalls/numOfBoxes) == 0 && boxCount < numOfBoxes-1 ? 1 : 0)

答案 1 :(得分:3)

int flag;
int lastBallAdded = 0;
int k = numOfBalls/numOfBoxes;
int m = numOfBalls%numOfBoxes;

for(int i = 0; i < numOfBoxes; i++, lastBallAdded+=k+flag) {
    flag = i<m;

    for(int j=lastBallAdded;j<lastBallAdded + k + flag;j++) 
        boxes.get(i).add(balls.get(j));
}

这是此解决方案背后的原因:

根据问题的定义,算法应该在每个框中放置k= numOfBalls/numOfBoxes个球,除了第一个m = numOfBalls%numOfBoxes框,你应该放置k+1个球。

您也可以将其写为

int i;
for(i = 0; i < m; i++) {
    //add k+1 balls
}

for(;i<numOfBoxes; i++) {
    //add k balls
}

答案 2 :(得分:2)

int ball = 0;
for( int box = 0; box < x; ++box )
   while ( x * (ball+1) <= y * (box+1) )
      boxes.get(box).add(balls.get(ball++));

循环不变:左k框包含球的分数k/x(圆形)。

答案 3 :(得分:1)

好的,新尝试:

boxCount = ((i * nbrOfBoxes) / nbrOfBalls) + 1;

注意,球的索引编号从0到4(如for循环中所示)。如果您希望boxCount为零,请删除+ 1