Skip to content

Commit 4156118

Browse files
committed
weekly contest 401
1 parent d025be9 commit 4156118

File tree

2 files changed

+120
-0
lines changed

2 files changed

+120
-0
lines changed

README.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@ Record leetcode contest and ideas every week, and encourage yourself to think mo
44

55
leetcode url: <https://leetcode.cn/u/cctest/>
66

7+
8+
* 🐼 [weekly contest 401](src/main/java/weekly/wk401.java) 暴力 | 前缀和 | 0-1背包 | bitset
79
* 🐼 [weekly contest 400](src/main/java/weekly/wk400.java) 遍历 | 排序 | 栈 | and性质
810
* 🐼 [weekly contest 399](src/main/java/weekly/wk399.java) 哈希 | 遍历 | 哈希 | 线段树
911
* 🐼 [weekly contest 398](src/main/java/weekly/wk398.java) 遍历 | 前缀和 | 遍历 | 记忆化搜索/组合数

src/main/java/weekly/wk401.java

Lines changed: 118 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,118 @@
1+
package weekly;
2+
3+
import java.math.BigInteger;
4+
import java.util.Arrays;
5+
import java.util.HashSet;
6+
import java.util.Set;
7+
8+
public class wk401 {
9+
10+
11+
//暴力
12+
static public int numberOfChild(int n, int k) {
13+
int d = (k % (2 * n - 2));
14+
if (d < n) {
15+
return d;
16+
} else {
17+
return n - (d - n) - 2;
18+
}
19+
}
20+
21+
22+
// 前缀和
23+
static public int valueAfterKSeconds(int n, int k) {
24+
int mod = (int) 1e9 + 7;
25+
26+
long[] pre = new long[n + 1];
27+
Arrays.fill(pre, 1);
28+
pre[0] = 0;
29+
for (int j = 0; j < k; j++) {
30+
for (int i = 1; i < pre.length; i++) {
31+
pre[i] += pre[i - 1];
32+
pre[i] %= mod;
33+
}
34+
}
35+
36+
37+
return (int) (pre[n] % mod);
38+
}
39+
40+
41+
// 0-1背包
42+
/* public int maxTotalReward(int[] rewardValues) {
43+
Arrays.sort(rewardValues);
44+
memo = new int[rewardValues.length][2000 * 2000 + 1];
45+
46+
int ans = dfs(0, 0, rewardValues);
47+
return ans;
48+
}
49+
50+
51+
int[][] memo;
52+
53+
int dfs(int x, int i, int[] rewardValues) {
54+
if (i >= rewardValues.length) {
55+
return x;
56+
}
57+
if (memo[i][x] != 0) return memo[i][x];
58+
int ans = 0;
59+
if (x < rewardValues[i]) {
60+
ans = Math.max(ans, dfs(x + rewardValues[i], i + 1, rewardValues));
61+
}
62+
int jump = Math.max(i + 1, lowerBound(rewardValues, x + 1));
63+
ans = Math.max(dfs(x, jump, rewardValues), ans);
64+
memo[i][x] = ans;
65+
return ans;
66+
}
67+
68+
// lowerBound 返回最小的满足 nums[i] >= target 的 i
69+
// 如果数组为空,或者所有数都 < target,则返回 nums.length
70+
// 要求 nums 是非递减的,即 nums[i] <= nums[i + 1]
71+
72+
// 闭区间写法
73+
private int lowerBound(int[] nums, int target) {
74+
int left = 0, right = nums.length - 1; // 闭区间 [left, right]
75+
while (left <= right) { // 区间不为空
76+
// 循环不变量:
77+
// nums[left-1] < target
78+
// nums[right+1] >= target
79+
int mid = left + (right - left) / 2;
80+
if (nums[mid] < target)
81+
left = mid + 1; // 范围缩小到 [mid+1, right]
82+
else
83+
right = mid - 1; // 范围缩小到 [left, mid-1]
84+
}
85+
return left; // 或者 right+1
86+
}*/
87+
88+
public static void main(String[] args) {
89+
wk401 w = new wk401();
90+
w.maxTotalReward(new int[]{1, 1, 3, 3});
91+
}
92+
93+
94+
95+
// bitset +剪枝
96+
public int maxTotalReward(int[] rewardValues) {
97+
int m = 0;
98+
for (int v : rewardValues) {
99+
m = Math.max(m, v);
100+
}
101+
for (int v : rewardValues) {
102+
if (v == m - 1) {
103+
return m * 2 - 1;
104+
}
105+
}
106+
107+
BigInteger f = BigInteger.ONE;
108+
for (int v : Arrays.stream(rewardValues).distinct().sorted().toArray()) {
109+
BigInteger mask = BigInteger.ONE.shiftLeft(v).subtract(BigInteger.ONE);
110+
f = f.or(f.and(mask).shiftLeft(v));
111+
}
112+
return f.bitLength() - 1;
113+
}
114+
115+
116+
117+
118+
}

0 commit comments

Comments
 (0)