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

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

假设有m个糖果,n位小朋友。
如果每个小朋友都分到一次算一轮,假设能分t轮,分完t轮后剩r个。
即:
分配分析图

求t和r

求t
知道了t也就求出了r=m-t。

开始分配

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

代码

class Solution {
public:
    vector<int> 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<int> 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;
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值