Skip to content

Commit 9b275d3

Browse files
committed
feat: add solutions to lc problem: No.2305
No.2305.Fair Distribution of Cookies
1 parent dfc755c commit 9b275d3

File tree

7 files changed

+249
-198
lines changed

7 files changed

+249
-198
lines changed

solution/2300-2399/2305.Fair Distribution of Cookies/README.md

Lines changed: 89 additions & 67 deletions
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,13 @@
5151

5252
<!-- 这里可写通用的实现逻辑 -->
5353

54-
**方法一:DFS + 剪枝**
54+
**方法一:回溯 + 剪枝**
55+
56+
我们先对数组 $cookies$ 进行降序排序(减少搜索次数),然后创建一个长度为 $k$ 的数组 $cnt$,用于存储每个孩子分到的饼干数量。另外,用变量 $ans$ 维护当前的最小不公平程度,初始化一个很大的值。
57+
58+
接下来,我们从第一个零食包开始,对于当前零食包 $i$,我们枚举每个孩子 $j$,如果当前零食包中的饼干 $cookies[i]$ 分给孩子 $j$ 后,使得不公平程度大于等于 $ans$,或者当前孩子已有的饼干数量与前一个孩子相同,那么我们不需要考虑将当前零食包中的饼干分给孩子 $j$,直接跳过(剪枝)。否则,我们将当前零食包中的饼干 $cookies[i]$ 分给孩子 $j$,然后继续考虑下一个零食包。当我们考虑完所有的零食包后,更新 $ans$ 的值,然后回溯到上一个零食包,继续枚举当前零食包中的饼干分给哪个孩子。
59+
60+
最后,我们返回 $ans$ 即可。
5561

5662
<!-- tabs:start -->
5763

@@ -62,19 +68,21 @@
6268
```python
6369
class Solution:
6470
def distributeCookies(self, cookies: List[int], k: int) -> int:
65-
def dfs(u):
66-
nonlocal ans
67-
if u == len(cookies):
68-
ans = min(ans, max(cnt))
71+
def dfs(i):
72+
if i >= len(cookies):
73+
nonlocal ans
74+
ans = max(cnt)
6975
return
70-
for i in range(k):
71-
if cnt[i] + cookies[u] < ans:
72-
cnt[i] += cookies[u]
73-
dfs(u + 1)
74-
cnt[i] -= cookies[u]
76+
for j in range(k):
77+
if cnt[j] + cookies[i] >= ans or (j and cnt[j] == cnt[j - 1]):
78+
continue
79+
cnt[j] += cookies[i]
80+
dfs(i + 1)
81+
cnt[j] -= cookies[i]
7582

7683
ans = inf
7784
cnt = [0] * k
85+
cookies.sort(reverse=True)
7886
dfs(0)
7987
return ans
8088
```
@@ -86,34 +94,39 @@ class Solution:
8694
```java
8795
class Solution {
8896
private int[] cookies;
89-
private int k;
9097
private int[] cnt;
91-
private int ans;
98+
private int k;
99+
private int n;
100+
private int ans = 1 << 30;
92101

93102
public int distributeCookies(int[] cookies, int k) {
94-
ans = 0x3f3f3f3f;
103+
n = cookies.length;
104+
cnt = new int[k];
105+
// 升序排列
106+
Arrays.sort(cookies);
95107
this.cookies = cookies;
96108
this.k = k;
97-
this.cnt = new int[k];
98-
dfs(0);
109+
// 这里搜索顺序是 n-1, n-2,...0
110+
dfs(n - 1);
99111
return ans;
100112
}
101113

102-
private void dfs(int u) {
103-
if (u == cookies.length) {
104-
int mx = cnt[0];
114+
private void dfs(int i) {
115+
if (i < 0) {
116+
// ans = Arrays.stream(cnt).max().getAsInt();
117+
ans = 0;
105118
for (int v : cnt) {
106-
mx = Math.max(mx, v);
119+
ans = Math.max(ans, v);
107120
}
108-
ans = Math.min(ans, mx);
109121
return;
110122
}
111-
for (int i = 0; i < k; ++i) {
112-
if (cnt[i] + cookies[u] < ans) {
113-
cnt[i] += cookies[u];
114-
dfs(u + 1);
115-
cnt[i] -= cookies[u];
123+
for (int j = 0; j < k; ++j) {
124+
if (cnt[j] + cookies[i] >= ans || (j > 0 && cnt[j] == cnt[j - 1])) {
125+
continue;
116126
}
127+
cnt[j] += cookies[i];
128+
dfs(i - 1);
129+
cnt[j] -= cookies[i];
117130
}
118131
}
119132
}
@@ -124,58 +137,55 @@ class Solution {
124137
```cpp
125138
class Solution {
126139
public:
127-
vector<int> cookies;
128-
vector<int> cnt;
129-
int k;
130-
int ans;
131-
132140
int distributeCookies(vector<int>& cookies, int k) {
133-
ans = 0x3f3f3f3f;
134-
this->cookies = cookies;
135-
this->cnt = vector<int>(k);
136-
this->k = k;
141+
sort(cookies.rbegin(), cookies.rend());
142+
int cnt[k];
143+
memset(cnt, 0, sizeof cnt);
144+
int n = cookies.size();
145+
int ans = 1 << 30;
146+
function<void(int)> dfs = [&](int i) {
147+
if (i >= n) {
148+
ans = *max_element(cnt, cnt + k);
149+
return;
150+
}
151+
for (int j = 0; j < k; ++j) {
152+
if (cnt[j] + cookies[i] >= ans || (j && cnt[j] == cnt[j - 1])) {
153+
continue;
154+
}
155+
cnt[j] += cookies[i];
156+
dfs(i + 1);
157+
cnt[j] -= cookies[i];
158+
}
159+
};
137160
dfs(0);
138161
return ans;
139162
}
140-
141-
void dfs(int u) {
142-
if (u == cookies.size()) {
143-
ans = min(ans, *max_element(cnt.begin(), cnt.end()));
144-
return;
145-
}
146-
for (int i = 0; i < k; ++i) {
147-
if (cnt[i] + cookies[u] < ans) {
148-
cnt[i] += cookies[u];
149-
dfs(u + 1);
150-
cnt[i] -= cookies[u];
151-
}
152-
}
153-
}
154163
};
155164
```
156165
157166
### **Go**
158167
159168
```go
160169
func distributeCookies(cookies []int, k int) int {
170+
sort.Sort(sort.Reverse(sort.IntSlice(cookies)))
161171
cnt := make([]int, k)
162-
ans := 0x3f3f3f3f
172+
ans := 1 << 30
163173
var dfs func(int)
164-
dfs = func(u int) {
165-
if u == len(cookies) {
166-
mx := cnt[0]
174+
dfs = func(i int) {
175+
if i >= len(cookies) {
176+
ans = 0
167177
for _, v := range cnt {
168-
mx = max(mx, v)
178+
ans = max(ans, v)
169179
}
170-
ans = min(ans, mx)
171180
return
172181
}
173-
for i := 0; i < k; i++ {
174-
if cnt[i]+cookies[u] < ans {
175-
cnt[i] += cookies[u]
176-
dfs(u + 1)
177-
cnt[i] -= cookies[u]
182+
for j := 0; j < k; j++ {
183+
if cnt[j]+cookies[i] >= ans || (j > 0 && cnt[j] == cnt[j-1]) {
184+
continue
178185
}
186+
cnt[j] += cookies[i]
187+
dfs(i + 1)
188+
cnt[j] -= cookies[i]
179189
}
180190
}
181191
dfs(0)
@@ -188,19 +198,31 @@ func max(a, b int) int {
188198
}
189199
return b
190200
}
191-
192-
func min(a, b int) int {
193-
if a < b {
194-
return a
195-
}
196-
return b
197-
}
198201
```
199202

200203
### **TypeScript**
201204

202205
```ts
203-
206+
function distributeCookies(cookies: number[], k: number): number {
207+
const cnt = new Array(k).fill(0);
208+
let ans = 1 << 30;
209+
const dfs = (i: number) => {
210+
if (i >= cookies.length) {
211+
ans = Math.max(...cnt);
212+
return;
213+
}
214+
for (let j = 0; j < k; ++j) {
215+
if (cnt[j] + cookies[i] >= ans || (j && cnt[j] == cnt[j - 1])) {
216+
continue;
217+
}
218+
cnt[j] += cookies[i];
219+
dfs(i + 1);
220+
cnt[j] -= cookies[i];
221+
}
222+
};
223+
dfs(0);
224+
return ans;
225+
}
204226
```
205227

206228
### **...**

0 commit comments

Comments
 (0)