力扣1103. 分糖果 II 解题记录

题目:https://leetcode-cn.com/problems/distribute-candies-to-people/

假设有m个糖果,n位小朋友。
如果每个小朋友都分到一次算一轮,假设能分t轮,分完t轮后剩r个。
即:
力扣1103. 分糖果 II 解题记录_第1张图片

求t和r

力扣1103. 分糖果 II 解题记录_第2张图片
知道了t也就求出了r=m-t。

开始分配

然后问题就简单了,在前t轮中每个小朋友分到的糖果可以通过等差数列求和得出。
第t+1轮就一个小朋友一个小朋友的分。
第i个小朋友应该分t*num_people+i个,若分完还剩下糖果就继续分给下一个小朋友;若不够了就把剩余的糖果全给当前这个小朋友。

代码

class Solution {
public:
    vector distributeCandies(int candies, int num_people) {
        int t,r,i,k;
        t=int((pow(2*candies+0.25,0.5)-0.5/num_people)/num_people);  //成功分发t轮糖果
        r=candies-(t*num_people+pow(t*num_people,2))/2;   //剩余糖果为r
        vector ans(num_people, 0);
        if(t>0){
            for(i=1;i<=num_people;i++){
                ans[i-1]=num_people*t*(t-1)/2+i*t;  //前t轮每个小朋友分到的糖果
            }
        }
        for(i=1;i<=num_people;i++){
            k=t*num_people+i;   // 第t+1轮中,第i个小朋友应分得的糖果。
            if(r>k){  //剩余糖果比第i个小朋友应分的糖果要多,即分给第i个小朋友后还有剩余
                ans[i-1]=ans[i-1]+k;
                r=r-k;
            }
            else{   //剩余糖果不足,全给第i个小朋友
                ans[i-1]=ans[i-1]+r; 
                break;
            }
        }
        return ans;
    }
};

你可能感兴趣的:(leetcode)