【问题标题】:Distribute 'items' in buckets equally (best effort)在桶中平均分配“项目”(尽力而为)
【发布时间】:2014-03-09 22:25:26
【问题描述】:

假设我想将y 项目平均分配到x 桶。如果xy 的倍数,则此分布将是均匀的,否则我可以在每个存储桶中得到0 项目。例如:

例如:我有 3 存储桶,我想每个分配 2 项目。由于进行除法(2/3) 将导致每个桶的0 项目。如何实现,110 的分布?

【问题讨论】:

  • 我觉得你的问题太模糊了,无法回答。您是否正在尝试实现一个返回存储桶的 java 方法,其中包含项目?
  • 我找到了一个解决方案,可以准确地向您报告每个存储桶中有多少项目。它会根据需要为您提供 (1, 1, 0) 之类的分布。 :)

标签: java algorithm math distribution


【解决方案1】:

这是一个递归解决方案,只是为了好玩。

import java.util.Arrays;

public class PizzaDistributor {

  public int[] distributePizzaToEatersEvenly(int numSlices, int[] eaters) {
    if (eaters == null || eaters.length == 0) {
      return null;
    }
    if (eaters.length > numSlices) {
      for (int i = 0; i < numSlices; i++) {
        eaters[i] += 1;
      }
    } else {
      int slices = numSlices / eaters.length;
      for (int i = 0; i < eaters.length; i++) {
        eaters[i] = slices;
      }
      //If there is a remainder to distribute, distribute it evenly, recursively.
      if ((numSlices % eaters.length) > 0) {
        distributePizzaToEatersEvenly(numSlices % eaters.length, eaters);
      }
    }
    return eaters;
  }

  public static void main(String[] args){
    PizzaDistributor pizzaDistributor = new PizzaDistributor ();
    System.out.println("0 slices, 1 eater:" +Arrays.toString(pizzaDistributor.distributePizzaToEatersEvenly(0,new int[1])));
    System.out.println("0 slices, 2 eaters:" +Arrays.toString(pizzaDistributor.distributePizzaToEatersEvenly(0,new int[2])));
    System.out.println("0 slices, 0 eaters:" +Arrays.toString(pizzaDistributor.distributePizzaToEatersEvenly(0,new int[0])));
    System.out.println("10 slices, 0 eaters:"+Arrays.toString(pizzaDistributor.distributePizzaToEatersEvenly(10,new int[0])));
    System.out.println("10 slices, 1 eater:" +Arrays.toString(pizzaDistributor.distributePizzaToEatersEvenly(10,new int[1]))); //lucky guy!
    System.out.println("10 slices, 3 eaters:" +Arrays.toString(pizzaDistributor.distributePizzaToEatersEvenly(10,new int[3])));
    System.out.println("10 slices, 5 eaters:" +Arrays.toString(pizzaDistributor.distributePizzaToEatersEvenly(10,new int[5])));
    System.out.println("10 slices, 7 eaters:" +Arrays.toString(pizzaDistributor.distributePizzaToEatersEvenly(10,new int[7])));
    System.out.println("10 slices, 10 eaters:" +Arrays.toString(pizzaDistributor.distributePizzaToEatersEvenly(10,new int[10])));
    System.out.println("10 slices, 13 eaters:" +Arrays.toString(pizzaDistributor.distributePizzaToEatersEvenly(10,new int[13])));
    System.out.println("10 slices, 20 eaters:" +Arrays.toString(pizzaDistributor.distributePizzaToEatersEvenly(10,new int[20])));

  }

}

产生这个输出:

0 slices, 1 eater:[0]
0 slices, 2 eaters:[0, 0]
0 slices, 0 eaters:null
10 slices, 0 eaters:null
10 slices, 1 eater:[10]
10 slices, 3 eaters:[4, 3, 3]
10 slices, 5 eaters:[2, 2, 2, 2, 2]
10 slices, 7 eaters:[2, 2, 2, 1, 1, 1, 1]
10 slices, 10 eaters:[1, 1, 1, 1, 1, 1, 1, 1, 1, 1]
10 slices, 13 eaters:[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0]
10 slices, 20 eaters:[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]

Process finished with exit code 0

【讨论】:

    【解决方案2】:

    看起来你知道如何解决编程问题,但你正在寻找一个想法,我认为你在帕斯卡三角形中的答案,与帕斯卡三角形有点不同,将你的整个项目放入三角形的顶部单元格中...... . 所以,实际上,我认为这不是最好的努力

    【讨论】:

      【解决方案3】:

      每个桶得到 y/x(整数除法)项目,y % x 个桶得到 1 个额外项目。

      【讨论】:

        【解决方案4】:

        这种想法应该可行:

        package sandbox;
        
        public class Sandbox
        {
        
            public static void main(String[] args)
            {
                int numBuckets = 12;
                int numItems = 34;
        
                int itemsPerBucket = (numItems / numBuckets);
                int remainingItems = (numItems % numBuckets);
        
                for (int i = 1; i <= numBuckets; i++)
                {
                    int extra = (i <= remainingItems) ? 1:0;
                    System.out.println("bucket " + i + " contains " + (itemsPerBucket + extra) + " items.");
                }
            }
        }
        

        这个的输出:

        bucket 1 contains 3 items.
        bucket 2 contains 3 items.
        bucket 3 contains 3 items.
        bucket 4 contains 3 items.
        bucket 5 contains 3 items.
        bucket 6 contains 3 items.
        bucket 7 contains 3 items.
        bucket 8 contains 3 items.
        bucket 9 contains 3 items.
        bucket 10 contains 3 items.
        bucket 11 contains 2 items.
        bucket 12 contains 2 items.
        

        请注意,您所做的唯一循环是讨论每个存储桶。你可以很容易地问一个桶号,看看里面有多少项目没有循环!

        【讨论】:

        • 如果您想知道,请输入“int extra = (i
        【解决方案5】:

        第一个 y mod x 存储桶将有 (y div x) + 1 项目,其余的将有 y div x 项目

        【讨论】:

          【解决方案6】:

          您的问题有点含糊,但是从 itemNumber 的除法中取出余数(如果它们在列表或数组中,这可能是索引)和存储桶的数量作为存储桶的索引会给您您正在寻找的均匀分布。

          int bucketIndex = itemNumber % numberOfBuckets; 
          

          【讨论】:

          • 循环赛。我想计算“数字”,因为我不需要迭代。
          • 我不明白。您能否使用更多信息或带有一些输入和所需输出的方法签名来更新您的问题?
          猜你喜欢
          • 2018-06-16
          • 1970-01-01
          • 2012-06-30
          • 1970-01-01
          • 2018-01-31
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-05-14
          相关资源
          最近更新 更多