1104-分キャンディII


前言
Weekly Contest 143の分糖類II
並んで座って、キャンディを分けます.
私たちはキャンディcandiesを買って、列に並んでいるn = num_people人の子供に分けようとしました.
最初の子供に1粒のキャンディをあげ、2番目の子供に2粒をあげ、それによって最後の子供にn粒のキャンディをあげるまで押します.
それから、私たちは再びチームの起点に戻って、最初の子供にn + 1粒のキャンディをあげて、2番目の子供にn + 2粒をあげて、このように押して、最後の子供に2 * n粒のキャンディをあげます.
上記の手順(毎回前回より1粒多くのキャンディを与え、チームのゴールに着いたら再びチームのスタート地点から)を繰り返して、私たちがすべてのキャンディを分け終わるまで、私たちの手の中の残りのキャンディの数が足りなくても(前回のキャンディより多くなくても)、これらのキャンディはすべて現在の子供に配布されます.
長さnum_people、要素の和candiesの配列を返して、キャンディの最終的な配布状況(すなわち、ans[i]i番目の子供が分けたキャンディの数)を表す.
例1:
  :candies = 7, num_people = 4
  :[1,2,3,1]
  :
   ,ans[0] += 1,     [1,0,0,0]。
   ,ans[1] += 2,     [1,2,0,0]。
   ,ans[2] += 3,     [1,2,3,0]。
   ,ans[3] += 1(        1    ),       [1,2,3,1]。

例2:
  :candies = 10, num_people = 3
  :[5,2,3]
  :
   ,ans[0] += 1,     [1,0,0]。
   ,ans[1] += 2,     [1,2,0]。
   ,ans[2] += 3,     [1,2,3]。
   ,ans[0] += 4,       [5,2,3]。

ヒント:
  • 1 <= candies <= 10^9
  • 1 <= num_people <= 1000

  • 問題を解く構想.
    この問題は非常に簡単で、具体的な論理は実現コードと関連注釈を表示すればよい.
    インプリメンテーションコード
       /**
         * 1104.     II
         * @param candies
         * @param num_people
         * @return
         */
        public int[] distributeCandies(int candies, int num_people) {
            int[] result=new int[num_people];
            //        
            int index=0;
            //          
            int num=1;
            while (candies>0){
                //        
                result[index]+=num;
                //        
                candies-=num;
                //              
                if(indexnum){
                    ++num;
                }else{
                    num=candies;
                }
            }
            return result;
        }