题目:https://leetcode-cn.com/problems/distribute-candies-to-people/
假设有m个糖果,n位小朋友。
如果每个小朋友都分到一次算一轮,假设能分t轮,分完t轮后剩r个。
即:
求t和r
知道了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;
}
};