Skip to content

Commit 0be93a9

Browse files
authored
feat: add solutions to lc problem: No.3007 (doocs#2222)
No.3007.Maximum Number That Sum of the Prices Is Less Than or Equal to K
1 parent c3742e6 commit 0be93a9

File tree

6 files changed

+441
-8
lines changed

6 files changed

+441
-8
lines changed

solution/3000-3099/3007.Maximum Number That Sum of the Prices Is Less Than or Equal to K/README.md

+147-4
Original file line numberDiff line numberDiff line change
@@ -65,27 +65,170 @@
6565
<!-- 这里可写当前语言的特殊实现逻辑 -->
6666

6767
```python
68-
68+
class Solution:
69+
def findMaximumNumber(self, k: int, x: int) -> int:
70+
@cache
71+
def dfs(pos, limit, cnt):
72+
if pos == 0:
73+
return cnt
74+
ans = 0
75+
up = (self.num >> (pos - 1) & 1) if limit else 1
76+
for i in range(up + 1):
77+
ans += dfs(pos - 1, limit and i == up, cnt + (i == 1 and pos % x == 0))
78+
return ans
79+
80+
l, r = 1, 10**18
81+
while l < r:
82+
mid = (l + r + 1) >> 1
83+
self.num = mid
84+
v = dfs(mid.bit_length(), True, 0)
85+
dfs.cache_clear()
86+
if v <= k:
87+
l = mid
88+
else:
89+
r = mid - 1
90+
return l
6991
```
7092

7193
### **Java**
7294

7395
<!-- 这里可写当前语言的特殊实现逻辑 -->
7496

7597
```java
76-
98+
class Solution {
99+
private int x;
100+
private long num;
101+
private Long[][] f;
102+
103+
public long findMaximumNumber(long k, int x) {
104+
this.x = x;
105+
long l = 1, r = (long) 1e17;
106+
while (l < r) {
107+
long mid = (l + r + 1) >>> 1;
108+
num = mid;
109+
f = new Long[65][65];
110+
int pos = 64 - Long.numberOfLeadingZeros(mid);
111+
if (dfs(pos, 0, true) <= k) {
112+
l = mid;
113+
} else {
114+
r = mid - 1;
115+
}
116+
}
117+
return l;
118+
}
119+
120+
private long dfs(int pos, int cnt, boolean limit) {
121+
if (pos == 0) {
122+
return cnt;
123+
}
124+
if (!limit && f[pos][cnt] != null) {
125+
return f[pos][cnt];
126+
}
127+
long ans = 0;
128+
int up = limit ? (int) (num >> (pos - 1) & 1) : 1;
129+
for (int i = 0; i <= up; ++i) {
130+
ans += dfs(pos - 1, cnt + (i == 1 && pos % x == 0 ? 1 : 0), limit && i == up);
131+
}
132+
if (!limit) {
133+
f[pos][cnt] = ans;
134+
}
135+
return ans;
136+
}
137+
}
77138
```
78139

79140
### **C++**
80141

81142
```cpp
82-
143+
class Solution {
144+
public:
145+
long long findMaximumNumber(long long k, int x) {
146+
using ll = long long;
147+
ll l = 1, r = 1e17;
148+
ll num = 0;
149+
ll f[65][65];
150+
function<ll(int, int, bool)> dfs = [&](int pos, int cnt, bool limit) -> ll {
151+
if (pos == 0) {
152+
return cnt;
153+
}
154+
if (!limit && f[pos][cnt] != -1) {
155+
return f[pos][cnt];
156+
}
157+
int up = limit ? num >> (pos - 1) & 1 : 1;
158+
ll ans = 0;
159+
for (int i = 0; i <= up; ++i) {
160+
ans += dfs(pos - 1, cnt + (i == 1 && pos % x == 0), limit && i == up);
161+
}
162+
if (!limit) {
163+
f[pos][cnt] = ans;
164+
}
165+
return ans;
166+
};
167+
while (l < r) {
168+
ll mid = (l + r + 1) >> 1;
169+
num = mid;
170+
memset(f, -1, sizeof(f));
171+
int pos = 64 - __builtin_clzll(mid);
172+
if (dfs(pos, 0, true) <= k) {
173+
l = mid;
174+
} else {
175+
r = mid - 1;
176+
}
177+
}
178+
return l;
179+
}
180+
};
83181
```
84182
85183
### **Go**
86184
87185
```go
88-
186+
func findMaximumNumber(k int64, x int) int64 {
187+
var l, r int64 = 1, 1e17
188+
var num int64
189+
var f [65][65]int64
190+
var dfs func(pos, cnt int, limit bool) int64
191+
dfs = func(pos, cnt int, limit bool) int64 {
192+
if pos == 0 {
193+
return int64(cnt)
194+
}
195+
if !limit && f[pos][cnt] != -1 {
196+
return f[pos][cnt]
197+
}
198+
var ans int64
199+
up := 1
200+
if limit {
201+
up = int(num >> (pos - 1) & 1)
202+
}
203+
for i := 0; i <= up; i++ {
204+
v := cnt
205+
if i == 1 && pos%x == 0 {
206+
v++
207+
}
208+
ans += dfs(pos-1, v, limit && i == up)
209+
}
210+
if !limit {
211+
f[pos][cnt] = ans
212+
}
213+
return ans
214+
}
215+
for l < r {
216+
mid := (l + r + 1) >> 1
217+
num = mid
218+
m := bits.Len(uint(num))
219+
for i := range f {
220+
for j := range f[i] {
221+
f[i][j] = -1
222+
}
223+
}
224+
if dfs(m, 0, true) <= k {
225+
l = mid
226+
} else {
227+
r = mid - 1
228+
}
229+
}
230+
return l
231+
}
89232
```
90233

91234
### **...**

solution/3000-3099/3007.Maximum Number That Sum of the Prices Is Less Than or Equal to K/README_EN.md

+147-4
Original file line numberDiff line numberDiff line change
@@ -57,25 +57,168 @@ Because the sum of the prices of the first 10 numbers is 8, the answer is 9.</pr
5757
### **Python3**
5858

5959
```python
60-
60+
class Solution:
61+
def findMaximumNumber(self, k: int, x: int) -> int:
62+
@cache
63+
def dfs(pos, limit, cnt):
64+
if pos == 0:
65+
return cnt
66+
ans = 0
67+
up = (self.num >> (pos - 1) & 1) if limit else 1
68+
for i in range(up + 1):
69+
ans += dfs(pos - 1, limit and i == up, cnt + (i == 1 and pos % x == 0))
70+
return ans
71+
72+
l, r = 1, 10**18
73+
while l < r:
74+
mid = (l + r + 1) >> 1
75+
self.num = mid
76+
v = dfs(mid.bit_length(), True, 0)
77+
dfs.cache_clear()
78+
if v <= k:
79+
l = mid
80+
else:
81+
r = mid - 1
82+
return l
6183
```
6284

6385
### **Java**
6486

6587
```java
66-
88+
class Solution {
89+
private int x;
90+
private long num;
91+
private Long[][] f;
92+
93+
public long findMaximumNumber(long k, int x) {
94+
this.x = x;
95+
long l = 1, r = (long) 1e17;
96+
while (l < r) {
97+
long mid = (l + r + 1) >>> 1;
98+
num = mid;
99+
f = new Long[65][65];
100+
int pos = 64 - Long.numberOfLeadingZeros(mid);
101+
if (dfs(pos, 0, true) <= k) {
102+
l = mid;
103+
} else {
104+
r = mid - 1;
105+
}
106+
}
107+
return l;
108+
}
109+
110+
private long dfs(int pos, int cnt, boolean limit) {
111+
if (pos == 0) {
112+
return cnt;
113+
}
114+
if (!limit && f[pos][cnt] != null) {
115+
return f[pos][cnt];
116+
}
117+
long ans = 0;
118+
int up = limit ? (int) (num >> (pos - 1) & 1) : 1;
119+
for (int i = 0; i <= up; ++i) {
120+
ans += dfs(pos - 1, cnt + (i == 1 && pos % x == 0 ? 1 : 0), limit && i == up);
121+
}
122+
if (!limit) {
123+
f[pos][cnt] = ans;
124+
}
125+
return ans;
126+
}
127+
}
67128
```
68129

69130
### **C++**
70131

71132
```cpp
72-
133+
class Solution {
134+
public:
135+
long long findMaximumNumber(long long k, int x) {
136+
using ll = long long;
137+
ll l = 1, r = 1e17;
138+
ll num = 0;
139+
ll f[65][65];
140+
function<ll(int, int, bool)> dfs = [&](int pos, int cnt, bool limit) -> ll {
141+
if (pos == 0) {
142+
return cnt;
143+
}
144+
if (!limit && f[pos][cnt] != -1) {
145+
return f[pos][cnt];
146+
}
147+
int up = limit ? num >> (pos - 1) & 1 : 1;
148+
ll ans = 0;
149+
for (int i = 0; i <= up; ++i) {
150+
ans += dfs(pos - 1, cnt + (i == 1 && pos % x == 0), limit && i == up);
151+
}
152+
if (!limit) {
153+
f[pos][cnt] = ans;
154+
}
155+
return ans;
156+
};
157+
while (l < r) {
158+
ll mid = (l + r + 1) >> 1;
159+
num = mid;
160+
memset(f, -1, sizeof(f));
161+
int pos = 64 - __builtin_clzll(mid);
162+
if (dfs(pos, 0, true) <= k) {
163+
l = mid;
164+
} else {
165+
r = mid - 1;
166+
}
167+
}
168+
return l;
169+
}
170+
};
73171
```
74172
75173
### **Go**
76174
77175
```go
78-
176+
func findMaximumNumber(k int64, x int) int64 {
177+
var l, r int64 = 1, 1e17
178+
var num int64
179+
var f [65][65]int64
180+
var dfs func(pos, cnt int, limit bool) int64
181+
dfs = func(pos, cnt int, limit bool) int64 {
182+
if pos == 0 {
183+
return int64(cnt)
184+
}
185+
if !limit && f[pos][cnt] != -1 {
186+
return f[pos][cnt]
187+
}
188+
var ans int64
189+
up := 1
190+
if limit {
191+
up = int(num >> (pos - 1) & 1)
192+
}
193+
for i := 0; i <= up; i++ {
194+
v := cnt
195+
if i == 1 && pos%x == 0 {
196+
v++
197+
}
198+
ans += dfs(pos-1, v, limit && i == up)
199+
}
200+
if !limit {
201+
f[pos][cnt] = ans
202+
}
203+
return ans
204+
}
205+
for l < r {
206+
mid := (l + r + 1) >> 1
207+
num = mid
208+
m := bits.Len(uint(num))
209+
for i := range f {
210+
for j := range f[i] {
211+
f[i][j] = -1
212+
}
213+
}
214+
if dfs(m, 0, true) <= k {
215+
l = mid
216+
} else {
217+
r = mid - 1
218+
}
219+
}
220+
return l
221+
}
79222
```
80223

81224
### **...**
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
class Solution {
2+
public:
3+
long long findMaximumNumber(long long k, int x) {
4+
using ll = long long;
5+
ll l = 1, r = 1e17;
6+
ll num = 0;
7+
ll f[65][65];
8+
function<ll(int, int, bool)> dfs = [&](int pos, int cnt, bool limit) -> ll {
9+
if (pos == 0) {
10+
return cnt;
11+
}
12+
if (!limit && f[pos][cnt] != -1) {
13+
return f[pos][cnt];
14+
}
15+
int up = limit ? num >> (pos - 1) & 1 : 1;
16+
ll ans = 0;
17+
for (int i = 0; i <= up; ++i) {
18+
ans += dfs(pos - 1, cnt + (i == 1 && pos % x == 0), limit && i == up);
19+
}
20+
if (!limit) {
21+
f[pos][cnt] = ans;
22+
}
23+
return ans;
24+
};
25+
while (l < r) {
26+
ll mid = (l + r + 1) >> 1;
27+
num = mid;
28+
memset(f, -1, sizeof(f));
29+
int pos = 64 - __builtin_clzll(mid);
30+
if (dfs(pos, 0, true) <= k) {
31+
l = mid;
32+
} else {
33+
r = mid - 1;
34+
}
35+
}
36+
return l;
37+
}
38+
};

0 commit comments

Comments
 (0)