@@ -91,7 +91,13 @@ Bob 获得总分 8 + 9 + 10 = 27 。
91
91
92
92
### 方法一:二进制枚举
93
93
94
- 枚举 bob 射箭的最终状态,寻找满足题意的、且使得 bob 得分最大的状态。
94
+ 由于区域数目只有 $12$ 个,因此我们使用二进制枚举的方式,枚举 $\textit{Bob}$ 在哪些区域得分。用一个变量 $\textit{st}$ 表示 $\textit{Bob}$ 获得最大得分的方案,而 $\textit{mx}$ 表示 $\textit{Bob}$ 获得的最大得分。
95
+
96
+ 我们在 $[ 1, 2^m)$ 的区间内枚举 $\textit{Bob}$ 的得分方案,其中 $m$ 是 $\textit{aliceArrows}$ 的长度。对于每一个方案,我们计算 $\textit{Bob}$ 的得分 $\textit{s}$ 以及射箭的数量 $\textit{cnt}$。如果 $\textit{cnt} \leq \textit{numArrows}$ 且 $\textit{s} > \textit{mx}$,我们就更新 $\textit{mx}$ 和 $\textit{st}$。
97
+
98
+ 然后,我们根据 $\textit{st}$ 计算 $\textit{Bob}$ 的得分方案,如果最后还有剩余的射箭,我们将剩余的射箭分配给第一个区域,即下标为 $0$ 的区域。
99
+
100
+ 时间复杂度 $O(2^m \times m)$,其中 $m$ 是 $\textit{aliceArrows}$ 的长度。忽略答案数组的空间消耗,空间复杂度 $O(1)$。
95
101
96
102
<!-- tabs:start -->
97
103
@@ -100,24 +106,23 @@ Bob 获得总分 8 + 9 + 10 = 27 。
100
106
``` python
101
107
class Solution :
102
108
def maximumBobPoints (self , numArrows : int , aliceArrows : List[int ]) -> List[int ]:
103
- n = len (aliceArrows)
104
- state = 0
105
- mx = - 1
106
- for mask in range (1 << n):
107
- cnt = points = 0
108
- for i, alice in enumerate (aliceArrows):
109
- if (mask >> i) & 1 :
110
- cnt += alice + 1
111
- points += i
112
- if cnt <= numArrows and mx < points:
113
- state = mask
114
- mx = points
115
- ans = [0 ] * n
116
- for i, alice in enumerate (aliceArrows):
117
- if (state >> i) & 1 :
118
- ans[i] = alice + 1
109
+ st = mx = 0
110
+ m = len (aliceArrows)
111
+ for mask in range (1 , 1 << m):
112
+ cnt = s = 0
113
+ for i, x in enumerate (aliceArrows):
114
+ if mask >> i & 1 :
115
+ s += i
116
+ cnt += x + 1
117
+ if cnt <= numArrows and s > mx:
118
+ mx = s
119
+ st = mask
120
+ ans = [0 ] * m
121
+ for i, x in enumerate (aliceArrows):
122
+ if st >> i & 1 :
123
+ ans[i] = x + 1
119
124
numArrows -= ans[i]
120
- ans[0 ] = numArrows
125
+ ans[0 ] + = numArrows
121
126
return ans
122
127
```
123
128
@@ -126,25 +131,24 @@ class Solution:
126
131
``` java
127
132
class Solution {
128
133
public int [] maximumBobPoints (int numArrows , int [] aliceArrows ) {
129
- int n = aliceArrows . length ;
130
- int mx = - 1 ;
131
- int state = 0 ;
132
- for ( int mask = 1 ; mask < 1 << n; ++ mask) {
133
- int cnt = 0 , points = 0 ;
134
- for ( int i = 0 ; i < n; ++ i ) {
135
- if (((mask >> i) & 1 ) == 1 ) {
134
+ int st = 0 , mx = 0 ;
135
+ int m = aliceArrows . length ;
136
+ for ( int mask = 1 ; mask < 1 << m; ++ mask) {
137
+ int cnt = 0 , s = 0 ;
138
+ for ( int i = 0 ; i < m; ++ i) {
139
+ if ((mask >> i & 1 ) == 1 ) {
140
+ s += i;
136
141
cnt += aliceArrows[i] + 1 ;
137
- points += i;
138
142
}
139
143
}
140
- if (cnt <= numArrows && mx < points ) {
141
- state = mask ;
142
- mx = points ;
144
+ if (cnt <= numArrows && s > mx ) {
145
+ mx = s ;
146
+ st = mask ;
143
147
}
144
148
}
145
- int [] ans = new int [n ];
146
- for (int i = 0 ; i < n ; ++ i) {
147
- if (((state >> i) & 1 ) == 1 ) {
149
+ int [] ans = new int [m ];
150
+ for (int i = 0 ; i < m ; ++ i) {
151
+ if ((st >> i & 1 ) == 1 ) {
148
152
ans[i] = aliceArrows[i] + 1 ;
149
153
numArrows -= ans[i];
150
154
}
@@ -161,24 +165,24 @@ class Solution {
161
165
class Solution {
162
166
public:
163
167
vector<int > maximumBobPoints(int numArrows, vector<int >& aliceArrows) {
164
- int n = aliceArrows.size();
165
- int state = 0, mx = -1;
166
- for (int mask = 1; mask < 1 << n; ++mask) {
167
- int cnt = 0, points = 0;
168
- for (int i = 0; i < n; ++i) {
169
- if ((mask >> i) & 1) {
168
+ int st = 0, mx = 0;
169
+ int m = aliceArrows.size();
170
+ for (int mask = 1; mask < 1 << m; ++mask) {
171
+ int cnt = 0, s = 0;
172
+ for (int i = 0; i < m; ++i) {
173
+ if (mask >> i & 1) {
174
+ s += i;
170
175
cnt += aliceArrows[ i] + 1;
171
- points += i;
172
176
}
173
177
}
174
- if (cnt <= numArrows && mx < points ) {
175
- state = mask ;
176
- mx = points ;
178
+ if (cnt <= numArrows && s > mx ) {
179
+ mx = s ;
180
+ st = mask ;
177
181
}
178
182
}
179
- vector<int > ans(n );
180
- for (int i = 0; i < n ; ++i) {
181
- if ((state >> i) & 1) {
183
+ vector<int > ans(m );
184
+ for (int i = 0; i < m ; ++i) {
185
+ if (st >> i & 1) {
182
186
ans[ i] = aliceArrows[ i] + 1;
183
187
numArrows -= ans[ i] ;
184
188
}
@@ -193,25 +197,25 @@ public:
193
197
194
198
```go
195
199
func maximumBobPoints(numArrows int, aliceArrows []int) []int {
196
- n := len(aliceArrows)
197
- state, mx := 0, -1
198
- for mask := 1; mask < 1<<n ; mask++ {
199
- cnt, points := 0, 0
200
- for i, alice := range aliceArrows {
201
- if ( mask>>i) &1 == 1 {
202
- cnt += alice + 1
203
- points += i
200
+ st, mx := 0, 0
201
+ m := len(aliceArrows)
202
+ for mask := 1; mask < 1<<m ; mask++ {
203
+ cnt, s := 0, 0
204
+ for i, x := range aliceArrows {
205
+ if mask>>i&1 == 1 {
206
+ s += i
207
+ cnt += x + 1
204
208
}
205
209
}
206
- if cnt <= numArrows && mx < points {
207
- state = mask
208
- mx = points
210
+ if cnt <= numArrows && s > mx {
211
+ mx = s
212
+ st = mask
209
213
}
210
214
}
211
- ans := make([]int, n )
212
- for i, alice := range aliceArrows {
213
- if (state >>i)&1 == 1 {
214
- ans[i] = alice + 1
215
+ ans := make([]int, m )
216
+ for i, x := range aliceArrows {
217
+ if (st >>i)&1 == 1 {
218
+ ans[i] = x + 1
215
219
numArrows -= ans[i]
216
220
}
217
221
}
@@ -224,61 +228,103 @@ func maximumBobPoints(numArrows int, aliceArrows []int) []int {
224
228
225
229
``` ts
226
230
function maximumBobPoints(numArrows : number , aliceArrows : number []): number [] {
227
- const dfs = (arr : number [], i : number , c : number ): number [] => {
228
- if (i < 0 || c === 0 ) {
229
- arr [0 ] += c ;
230
- return arr ;
231
- }
232
- const a1 = dfs ([... arr ], i - 1 , c );
233
- if (c > aliceArrows [i ]) {
234
- arr [i ] = aliceArrows [i ] + 1 ;
235
- const a2 = dfs (arr , i - 1 , c - aliceArrows [i ] - 1 );
236
- if (
237
- a2 .reduce ((p , v , i ) => p + (v > 0 ? i : 0 ), 0 ) >=
238
- a1 .reduce ((p , v , i ) => p + (v > 0 ? i : 0 ), 0 )
239
- ) {
240
- return a2 ;
231
+ let [st, mx] = [0 , 0 ];
232
+ const m = aliceArrows .length ;
233
+ for (let mask = 1 ; mask < 1 << m ; mask ++ ) {
234
+ let [cnt, s] = [0 , 0 ];
235
+ for (let i = 0 ; i < m ; i ++ ) {
236
+ if ((mask >> i ) & 1 ) {
237
+ cnt += aliceArrows [i ] + 1 ;
238
+ s += i ;
241
239
}
242
240
}
243
- return a1 ;
244
- };
245
- return dfs (new Array (12 ).fill (0 ), 11 , numArrows );
241
+ if (cnt <= numArrows && s > mx ) {
242
+ mx = s ;
243
+ st = mask ;
244
+ }
245
+ }
246
+ const ans: number [] = Array (m ).fill (0 );
247
+ for (let i = 0 ; i < m ; i ++ ) {
248
+ if ((st >> i ) & 1 ) {
249
+ ans [i ] = aliceArrows [i ] + 1 ;
250
+ numArrows -= ans [i ];
251
+ }
252
+ }
253
+ ans [0 ] += numArrows ;
254
+ return ans ;
246
255
}
247
256
```
248
257
249
258
#### Rust
250
259
251
260
``` rust
252
261
impl Solution {
253
- fn dfs (alice_arrows : & Vec <i32 >, mut res : Vec <i32 >, count : i32 , i : usize ) -> Vec <i32 > {
254
- if i == 0 || count == 0 {
255
- res [0 ] += count ;
256
- return res ;
262
+ pub fn maximum_bob_points (num_arrows : i32 , alice_arrows : Vec <i32 >) -> Vec <i32 > {
263
+ let mut st = 0 ;
264
+ let mut mx = 0 ;
265
+ let m = alice_arrows . len ();
266
+ for mask in 1 .. (1 << m ) {
267
+ let mut cnt = 0 ;
268
+ let mut s = 0 ;
269
+ for i in 0 .. m {
270
+ if (mask >> i ) & 1 == 1 {
271
+ s += i as i32 ;
272
+ cnt += alice_arrows [i ] + 1 ;
273
+ }
274
+ }
275
+ if cnt <= num_arrows && s > mx {
276
+ mx = s ;
277
+ st = mask ;
278
+ }
257
279
}
258
- let r1 = Self :: dfs (alice_arrows , res . clone (), count , i - 1 );
259
- if count > alice_arrows [i ] {
260
- res [i ] = alice_arrows [i ] + 1 ;
261
- let r2 = Self :: dfs (alice_arrows , res , count - alice_arrows [i ] - 1 , i - 1 );
262
- if r2
263
- . iter ()
264
- . enumerate ()
265
- . map (| (i , v )| if v > & 0 { i } else { 0 })
266
- . sum :: <usize >()
267
- > r1 . iter ()
268
- . enumerate ()
269
- . map (| (i , v )| if v > & 0 { i } else { 0 })
270
- . sum :: <usize >()
271
- {
272
- return r2 ;
280
+ let mut ans = vec! [0 ; m ];
281
+ let mut num_arrows = num_arrows ;
282
+ for i in 0 .. m {
283
+ if (st >> i ) & 1 == 1 {
284
+ ans [i ] = alice_arrows [i ] + 1 ;
285
+ num_arrows -= ans [i ];
273
286
}
274
287
}
275
- r1
288
+ ans [0 ] += num_arrows ;
289
+ ans
276
290
}
291
+ }
292
+ ```
277
293
278
- pub fn maximum_bob_points (num_arrows : i32 , alice_arrows : Vec <i32 >) -> Vec <i32 > {
279
- Self :: dfs (& alice_arrows , vec! [0 ; 12 ], num_arrows , 11 )
294
+ #### JavaScript
295
+
296
+ ``` js
297
+ /**
298
+ * @param {number} numArrows
299
+ * @param {number[]} aliceArrows
300
+ * @return {number[]}
301
+ */
302
+ var maximumBobPoints = function (numArrows , aliceArrows ) {
303
+ let [st, mx] = [0 , 0 ];
304
+ const m = aliceArrows .length ;
305
+ for (let mask = 1 ; mask < 1 << m; mask++ ) {
306
+ let [cnt, s] = [0 , 0 ];
307
+ for (let i = 0 ; i < m; i++ ) {
308
+ if ((mask >> i) & 1 ) {
309
+ cnt += aliceArrows[i] + 1 ;
310
+ s += i;
311
+ }
312
+ }
313
+ if (cnt <= numArrows && s > mx) {
314
+ mx = s;
315
+ st = mask;
316
+ }
280
317
}
281
- }
318
+ const ans = Array (m).fill (0 );
319
+ for (let i = 0 ; i < m; i++ ) {
320
+ if ((st >> i) & 1 ) {
321
+ ans[i] = aliceArrows[i] + 1 ;
322
+ numArrows -= ans[i];
323
+ }
324
+ }
325
+ ans[0 ] += numArrows;
326
+ return ans;
327
+ };
282
328
```
283
329
284
330
<!-- tabs: end -->
0 commit comments