如何分配整数自上而下的一组人?

时间:2014-10-30 10:52:25

标签: java algorithm

我有一组排序的人,我想分配一个定义的计数自上而下。 例如:

情景:

int i = 8;
personA = 0;
personB = 0;
personC = 0;

期望的结果:

personA = 3;
personB = 3;
personC = 2;

当然我可以使用for / while循环进行迭代,但如果i非常大,可能效率低下。

结果也可以通过devision获得,没有循环吗?

伪代码:

distributed = 0;
while (distributed < i) {
    for (int p : persons) {
        p++;
        distributed++;
    }
}

互动步骤:

1-1-1 > start over > 2-2-2 > start over > 3-3-2

4 个答案:

答案 0 :(得分:3)

是的,当然有可能。由于您没有给出任何特定的实现,我只是将数字放在一个数组中。当然,这只是一个示范。假设NUM_OF_PERSONS是数组中的人数,NUM_TO_DISTRIBUTE是您要分发的数字。在你的例子中,8。

int persons[] = new int[NUM_OF_PERSONS];

int basicRation = NUM_TO_DISTRIBUTE / NUM_OF_PERSONS;
int peopleGettingExtra = NUM_TO_DISTRIBUTE % NUM_OF_PERSONS;

for ( int i = 0; i < NUM_OF_PERSONS; i ++ ) {
    persons[i] = basicRation + ( i < peopleGettingExtra ? 1 : 0 );
}

测试案例1:9给3人。基本比率为3.获得额外的人数为零。在循环中,由于没有i小于0,所以每个人都会得到basicRation + 0,这意味着3。

测试案例2:8给3人。基本比率是2.获得额外的人数是2.在循环中,索引0和1的人将获得2 + 1,最后一个人获得2 + 0。

答案 1 :(得分:2)

distributed = 0;
int howManyForEach = (int)(i/persons.size())

for(int p : person){
   p = howManyForEach ;
}
distrubuted = howManyForEach * persons.size();
while (distributed < i) {
    for (int p : persons) {
        p++;
        distributed++;
    }
}

答案 2 :(得分:2)

以下代码将运行 i = 8 5次 i = 10 4次随着我的增加,执行的时间循环次数成比例地减少

        int i = 10;

        int[] arr = new int[3] { 0, 0, 0 };

        int BaseVal = i / (arr.Length);
        int Remainder = i - (BaseVal * arr.Length);

        for (int x = 0; x < arr.Length  ;x++)
        {
            arr[x] = BaseVal;
        }
        for (int y = 0; y < Remainder; y++)
        {
            arr[y] = arr[y] + 1;
        }

答案 3 :(得分:1)

从问题中可以清楚地看出,任何人之间的最大差异是1

只需使用#persons / i = base value for every person

即可

#persons % i = # top persons with +1 value

示例

i = 5 , persons = 3: 
baseValue = 1
#topPersons = 2 

=> 2 2 1