2012-04-09 90 views
4

我在Android上开发应用程序时遇到了问题。然而,问题是:算法:将y球放入x盒子中,其中x <= y

x盒和y球,其中x <= y,我要分发的球,把它们放在箱子里面为了。例如:3盒; box Abox Bbox C - 和5个球; ball 1ball 2,ball 3,ball 4,ball 5

我需要的是把第一球ball 1box Aball 5box 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 
+0

只是为了澄清,你想要在球盒上均匀分布球吗? – 2012-04-09 20:08:58

+2

boxCount = i%nbrOfBoxes; – matsev 2012-04-09 20:09:07

+0

@YetAnotherGeek如果一个盒子的球比其他球多,那并不重要。 – 2012-04-09 20:10:08

回答

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 
} 
+0

'flag =我 2012-04-09 21:47:00

+0

@ Eng.Fouad尝试'flag = i Saphrosit 2012-04-09 21:48:46

+0

哦,是的!这是唯一正确工作的解决方案!感谢队友为此;) – 2012-04-09 21:51:54

3

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

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

+0

这会将3个球放入第一个盒子。 – 2012-04-09 20:42:09

+0

@DavidHarkness:当然了,谢谢。我错误地将我在第一行写到+ =声明的内容......现在正在做描述所描述的内容。然而,我看到这个问题被编辑,OP也在寻找更均匀分布的东西 – amit 2012-04-09 21:23:03

+0

我试过了,但它给了我'A:[1]' 'B:[2]' 'C:[3, 4,5]' – 2012-04-09 21:48:06

1

好了,新的尝试:

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

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

+0

'java.lang.IndexOutOfBoundsException:Index:3,Size:3' – 2012-04-09 21:48:53

+0

box A到C的索引是什么?如果它是'0..2',则按照建议移除'+ 1'。 – matsev 2012-04-10 04:52:04

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(四舍五入)。

+0

这给了我:'A:[1]' 'B:[2,3]' 'C:[4]',它会丢弃'5' – 2012-04-09 21:50:03

+0

@ Eng.Fouad:对不起,用'<='在while条件下'<'。编辑应用。 – 2012-04-09 21:53:44

+0

感谢队友,现在工作得很好。不过,我已经接受@ Saphrosit的回答,因为他在你之前发布了它:) – 2012-04-09 22:03:55

相关问题