【问题标题】:Sweet distribution (optimization)甜分布(优化)
【发布时间】:2018-02-05 14:19:39
【问题描述】:

假设 N,您获得了所提供的糖果的起始数量,为您提供 T,这样每次您从 N 分发 T 个糖果时,都会添加 1 个糖果。确定您可以分发的糖果数量。

例如。 N=5 , T=2

  • Step1: 5-2+1 糖果分发:2 剩余糖果:4
  • Step2: 4-2+1 糖果分发:2 剩余糖果:3
  • Step3: 3-2+1 糖果分发:2 剩余糖果:2
  • Step4: 2-2+1 糖果分发:2 剩余糖果:1
  • Step5:1个糖果分发:1个剩余糖果:0

    代码返回:Total sweet:9

我的代码如下:

    public static int countSweets(int n, int t) {
       //recursive code is commented
       /*if(n<t)
         return n;
        return t+countCandies(n-t+1,t);*/

     //simple while loop snippet
       int count=0;
       while(n>=t)
       {
         count=count+t;
         n=n-t+1;
       }
       return count+n;
    }

我尝试了简单和递归的两种方法。显示的错误是

  1. simple:超过时间限制
  2. 递归:堆栈溢出(用于 n 和 t 之间的较大差异)

【问题讨论】:

    标签: java algorithm optimization


    【解决方案1】:

    使用除以 T 而不是减去 T。对于 N=5,T=2:

    1. 5/2 = 2 次分发 = 2 个奖励项目和 1 个剩余项目
    2. 3/2 = 1 次分发 = 1 个奖励项目和 1 个剩余项目
    3. 2/2 = 1 次分发 = 1 个奖励项目 & 0 个剩余项目
    4. 1/2 = 0 - 部分分配,0 个奖励项目

    最终计数 = N+ 奖励项目 = 5+2+1+1+0 = 9

    在这个例子中,它只快了 1 步,但对于较大的 N,它会更显着。

    【讨论】:

      【解决方案2】:

      一些算术:

      S =  (N - 1) div (T - 1)   // div is integer division 7 div 3 = 2
      

      常规输出中的步骤(给予休息>0)。
      每一步减去 (T-1) 糖果 - 分母。减法一直到 1,而不是 0(因为在加法之前你不能有 -1 糖果)——这就是为什么 (N-1) 提名者。

      编辑:

      所以糖果的全部数量是起始值加上添加的数量(等于常规步骤的数量):

      F = N + S =
          N + (N - 1) div (T - 1) = 
          (N * (T - 1) + N - 1) / (T - 1) = 
          //very simple formula 
      
          (N * T - 1) div (T - 1) 
      

      检查(N,T) = (5,2); (7,3); (8,3); (17,4) 给出9;10;11;22

      【讨论】:

      • 你能解释一下s=(N-1) div(T-1)吗?所有步骤都是完美的,它给出了正确的答案,但你是怎么想出 s=(N-1)div(T-1) 的?
      • 每一步减去(T-1)糖果-分母。减法直到1,而不是0(因为在加法之前你不能有-1糖果)-这就是为什么(N-1)提名人
      • 我简化了逻辑。
      猜你喜欢
      • 2014-11-26
      • 2019-10-13
      • 2022-01-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-11-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多