Skip to content

Commit eed1d26

Browse files
committed
feat: add solutions to lc problem: No.2528
1 parent e711097 commit eed1d26

File tree

4 files changed

+188
-25
lines changed

4 files changed

+188
-25
lines changed

solution/2500-2599/2528.Maximize the Minimum Powered City/README.md

Lines changed: 63 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -203,24 +203,24 @@ class Solution {
203203
public:
204204
long long maxPower(vector<int>& stations, int r, int k) {
205205
int n = stations.size();
206-
long d[n + 1];
206+
long long d[n + 1];
207207
memset(d, 0, sizeof d);
208208
for (int i = 0; i < n; ++i) {
209209
int left = max(0, i - r), right = min(i + r, n - 1);
210210
d[left] += stations[i];
211211
d[right + 1] -= stations[i];
212212
}
213-
long s[n + 1];
213+
long long s[n + 1];
214214
s[0] = d[0];
215215
for (int i = 1; i < n + 1; ++i) {
216216
s[i] = s[i - 1] + d[i];
217217
}
218-
auto check = [&](long x, int k) {
218+
auto check = [&](long long x, int k) {
219219
memset(d, 0, sizeof d);
220-
long t = 0;
220+
long long t = 0;
221221
for (int i = 0; i < n; ++i) {
222222
t += d[i];
223-
long dist = x - (s[i] + t);
223+
long long dist = x - (s[i] + t);
224224
if (dist > 0) {
225225
if (k < dist) {
226226
return false;
@@ -235,9 +235,9 @@ public:
235235
}
236236
return true;
237237
};
238-
long left = 0, right = 1e12;
238+
long long left = 0, right = 1e12;
239239
while (left < right) {
240-
long mid = (left + right + 1) >> 1;
240+
long long mid = (left + right + 1) >> 1;
241241
if (check(mid, k)) {
242242
left = mid;
243243
} else {
@@ -353,6 +353,62 @@ function maxPower(stations: number[], r: number, k: number): number {
353353
}
354354
```
355355

356+
#### Rust
357+
358+
```rust
359+
impl Solution {
360+
pub fn max_power(stations: Vec<i32>, r: i32, k: i32) -> i64 {
361+
let n = stations.len();
362+
let mut d = vec![0i64; n + 2];
363+
for i in 0..n {
364+
let left = i.saturating_sub(r as usize);
365+
let right = (i + r as usize).min(n - 1);
366+
d[left] += stations[i] as i64;
367+
d[right + 1] -= stations[i] as i64;
368+
}
369+
370+
let mut s = vec![0i64; n + 1];
371+
s[0] = d[0];
372+
for i in 1..=n {
373+
s[i] = s[i - 1] + d[i];
374+
}
375+
376+
let check = |x: i64, mut k: i64| -> bool {
377+
let mut d = vec![0i64; n + 2];
378+
let mut t = 0i64;
379+
for i in 0..n {
380+
t += d[i];
381+
let dist = x - (s[i] + t);
382+
if dist > 0 {
383+
if k < dist {
384+
return false;
385+
}
386+
k -= dist;
387+
let j = (i + r as usize).min(n - 1);
388+
let left = j.saturating_sub(r as usize);
389+
let right = (j + r as usize).min(n - 1);
390+
d[left] += dist;
391+
d[right + 1] -= dist;
392+
t += dist;
393+
}
394+
}
395+
true
396+
};
397+
398+
let (mut left, mut right) = (0i64, 1_000_000_000_000i64);
399+
while left < right {
400+
let mid = (left + right + 1) >> 1;
401+
if check(mid, k as i64) {
402+
left = mid;
403+
} else {
404+
right = mid - 1;
405+
}
406+
}
407+
left
408+
}
409+
}
410+
```
411+
356412
<!-- tabs:end -->
357413

358414
<!-- solution:end -->

solution/2500-2599/2528.Maximize the Minimum Powered City/README_EN.md

Lines changed: 66 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -45,8 +45,8 @@ tags:
4545
<pre>
4646
<strong>Input:</strong> stations = [1,2,4,5,0], r = 1, k = 2
4747
<strong>Output:</strong> 5
48-
<strong>Explanation:</strong>
49-
One of the optimal ways is to install both the power stations at city 1.
48+
<strong>Explanation:</strong>
49+
One of the optimal ways is to install both the power stations at city 1.
5050
So stations will become [1,4,4,5,0].
5151
- City 0 is provided by 1 + 4 = 5 power stations.
5252
- City 1 is provided by 1 + 4 + 4 = 9 power stations.
@@ -62,7 +62,7 @@ Since it is not possible to obtain a larger power, we return 5.
6262
<pre>
6363
<strong>Input:</strong> stations = [4,4,4,4], r = 0, k = 3
6464
<strong>Output:</strong> 4
65-
<strong>Explanation:</strong>
65+
<strong>Explanation:</strong>
6666
It can be proved that we cannot make the minimum power of a city greater than 4.
6767
</pre>
6868

@@ -201,24 +201,24 @@ class Solution {
201201
public:
202202
long long maxPower(vector<int>& stations, int r, int k) {
203203
int n = stations.size();
204-
long d[n + 1];
204+
long long d[n + 1];
205205
memset(d, 0, sizeof d);
206206
for (int i = 0; i < n; ++i) {
207207
int left = max(0, i - r), right = min(i + r, n - 1);
208208
d[left] += stations[i];
209209
d[right + 1] -= stations[i];
210210
}
211-
long s[n + 1];
211+
long long s[n + 1];
212212
s[0] = d[0];
213213
for (int i = 1; i < n + 1; ++i) {
214214
s[i] = s[i - 1] + d[i];
215215
}
216-
auto check = [&](long x, int k) {
216+
auto check = [&](long long x, int k) {
217217
memset(d, 0, sizeof d);
218-
long t = 0;
218+
long long t = 0;
219219
for (int i = 0; i < n; ++i) {
220220
t += d[i];
221-
long dist = x - (s[i] + t);
221+
long long dist = x - (s[i] + t);
222222
if (dist > 0) {
223223
if (k < dist) {
224224
return false;
@@ -233,9 +233,9 @@ public:
233233
}
234234
return true;
235235
};
236-
long left = 0, right = 1e12;
236+
long long left = 0, right = 1e12;
237237
while (left < right) {
238-
long mid = (left + right + 1) >> 1;
238+
long long mid = (left + right + 1) >> 1;
239239
if (check(mid, k)) {
240240
left = mid;
241241
} else {
@@ -351,6 +351,62 @@ function maxPower(stations: number[], r: number, k: number): number {
351351
}
352352
```
353353

354+
#### Rust
355+
356+
```rust
357+
impl Solution {
358+
pub fn max_power(stations: Vec<i32>, r: i32, k: i32) -> i64 {
359+
let n = stations.len();
360+
let mut d = vec![0i64; n + 2];
361+
for i in 0..n {
362+
let left = i.saturating_sub(r as usize);
363+
let right = (i + r as usize).min(n - 1);
364+
d[left] += stations[i] as i64;
365+
d[right + 1] -= stations[i] as i64;
366+
}
367+
368+
let mut s = vec![0i64; n + 1];
369+
s[0] = d[0];
370+
for i in 1..=n {
371+
s[i] = s[i - 1] + d[i];
372+
}
373+
374+
let check = |x: i64, mut k: i64| -> bool {
375+
let mut d = vec![0i64; n + 2];
376+
let mut t = 0i64;
377+
for i in 0..n {
378+
t += d[i];
379+
let dist = x - (s[i] + t);
380+
if dist > 0 {
381+
if k < dist {
382+
return false;
383+
}
384+
k -= dist;
385+
let j = (i + r as usize).min(n - 1);
386+
let left = j.saturating_sub(r as usize);
387+
let right = (j + r as usize).min(n - 1);
388+
d[left] += dist;
389+
d[right + 1] -= dist;
390+
t += dist;
391+
}
392+
}
393+
true
394+
};
395+
396+
let (mut left, mut right) = (0i64, 1_000_000_000_000i64);
397+
while left < right {
398+
let mid = (left + right + 1) >> 1;
399+
if check(mid, k as i64) {
400+
left = mid;
401+
} else {
402+
right = mid - 1;
403+
}
404+
}
405+
left
406+
}
407+
}
408+
```
409+
354410
<!-- tabs:end -->
355411

356412
<!-- solution:end -->

solution/2500-2599/2528.Maximize the Minimum Powered City/Solution.cpp

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2,24 +2,24 @@ class Solution {
22
public:
33
long long maxPower(vector<int>& stations, int r, int k) {
44
int n = stations.size();
5-
long d[n + 1];
5+
long long d[n + 1];
66
memset(d, 0, sizeof d);
77
for (int i = 0; i < n; ++i) {
88
int left = max(0, i - r), right = min(i + r, n - 1);
99
d[left] += stations[i];
1010
d[right + 1] -= stations[i];
1111
}
12-
long s[n + 1];
12+
long long s[n + 1];
1313
s[0] = d[0];
1414
for (int i = 1; i < n + 1; ++i) {
1515
s[i] = s[i - 1] + d[i];
1616
}
17-
auto check = [&](long x, int k) {
17+
auto check = [&](long long x, int k) {
1818
memset(d, 0, sizeof d);
19-
long t = 0;
19+
long long t = 0;
2020
for (int i = 0; i < n; ++i) {
2121
t += d[i];
22-
long dist = x - (s[i] + t);
22+
long long dist = x - (s[i] + t);
2323
if (dist > 0) {
2424
if (k < dist) {
2525
return false;
@@ -34,9 +34,9 @@ class Solution {
3434
}
3535
return true;
3636
};
37-
long left = 0, right = 1e12;
37+
long long left = 0, right = 1e12;
3838
while (left < right) {
39-
long mid = (left + right + 1) >> 1;
39+
long long mid = (left + right + 1) >> 1;
4040
if (check(mid, k)) {
4141
left = mid;
4242
} else {
@@ -45,4 +45,4 @@ class Solution {
4545
}
4646
return left;
4747
}
48-
};
48+
};
Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
impl Solution {
2+
pub fn max_power(stations: Vec<i32>, r: i32, k: i32) -> i64 {
3+
let n = stations.len();
4+
let mut d = vec![0i64; n + 2];
5+
for i in 0..n {
6+
let left = i.saturating_sub(r as usize);
7+
let right = (i + r as usize).min(n - 1);
8+
d[left] += stations[i] as i64;
9+
d[right + 1] -= stations[i] as i64;
10+
}
11+
12+
let mut s = vec![0i64; n + 1];
13+
s[0] = d[0];
14+
for i in 1..=n {
15+
s[i] = s[i - 1] + d[i];
16+
}
17+
18+
let check = |x: i64, mut k: i64| -> bool {
19+
let mut d = vec![0i64; n + 2];
20+
let mut t = 0i64;
21+
for i in 0..n {
22+
t += d[i];
23+
let dist = x - (s[i] + t);
24+
if dist > 0 {
25+
if k < dist {
26+
return false;
27+
}
28+
k -= dist;
29+
let j = (i + r as usize).min(n - 1);
30+
let left = j.saturating_sub(r as usize);
31+
let right = (j + r as usize).min(n - 1);
32+
d[left] += dist;
33+
d[right + 1] -= dist;
34+
t += dist;
35+
}
36+
}
37+
true
38+
};
39+
40+
let (mut left, mut right) = (0i64, 1_000_000_000_000i64);
41+
while left < right {
42+
let mid = (left + right + 1) >> 1;
43+
if check(mid, k as i64) {
44+
left = mid;
45+
} else {
46+
right = mid - 1;
47+
}
48+
}
49+
left
50+
}
51+
}

0 commit comments

Comments
 (0)