題目: LeetCode - 1103. Distribute Candies to People

題目說明

給兩個整數,candies 表示糖果的數量,num_people 表示糖果要分給的人數。分糖果的規則為

1
2
3
4
5
6
7
8
9
10
num_people =  4
candies = 40
i: 0 1 2 3
people: 1 2 3 4
----------------------
round 1 1 2 3 4 每個人分到的糖果數: i + 1 + 0 * num_people
round 2 5 6 7 8 每個人分到的糖果數: i + 1 + 1 * num_people
round 3 4 每個人分到的糖果數: i + 1 + 2 * num_people 當糖果數量不夠時就全部給當前的那個人即可
----------------------
10 8 10 12

回傳一個代表每個人收到糖果數量的陣列。

解題思路

可以直接模擬每次發放糖果的情況,但是效率較低,我們可以使用等差數列總和的公式計算每輪的糖果數量,最後剩下的糖果在模擬發放的過程即可。

參考解法

1
2
3
4
5
6
7
8
9
10
11
12
13
class Solution {
public:
vector<int> distributeCandies(int candies, int num_people) {
int r = 0, tmp;
vector<int> v(num_people);
while(candies >= (tmp = (1 + num_people) * num_people / 2 + num_people * num_people * r)) candies -= tmp, ++r;
if(r) for(int i = 0; i < num_people; ++i) v[i] += (i + 1 + i + 1 + num_people * (r - 1)) * r / 2;
for(int i = 0; i < num_people; ++i)
if(candies >= (tmp = i + 1 + num_people * r)) v[i] += tmp, candies -= tmp;
else { v[i] += candies; break; }
return v;
}
};