Skip to content

Commit 4dd3675

Browse files
committed
weekly contest 301 82
1 parent 73d7b6f commit 4dd3675

File tree

5 files changed

+446
-8
lines changed

5 files changed

+446
-8
lines changed

README.md

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

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

7+
* ☀️ [weekly contest 301](src/main/java/weekly/wk301.java) Greegy | Hash Table | Two Pointers|Dynamic Programming+Combinatorics
78
* ☀️ [weekly contest 300](src/main/java/weekly/wk300.java) Hash Table | Simulation | DP | DP
89
*[weekly contest 299](src/main/java/weekly/wk299.java) Array | DP | DP | Enumeration + classification discussion
910
* ☁️ [weekly contest 298](src/main/java/weekly/wk298.java)
@@ -17,7 +18,7 @@ leetcode url: <https://leetcode.cn/u/cctest/>
1718
* 🐶 [weekly contest 290](src/main/java/weekly/wk290.java)
1819
* 🐭 [weekly contest 280](src/main/java/weekly/wk289.java)
1920

20-
21+
* 🐹 [biweekly contest 82](src/main/java/weekly/wkb82.java) DFS | Greedy | Greedy| Monotonic Stack/Union Find
2122
* 🐹 [biweekly contest 81](src/main/java/weekly/wkb81.java)
2223
* 🐰 [biweekly contest 80](src/main/java/weekly/wkb80.java)
2324
* 🐺 [biweekly contest 79](src/main/java/weekly/wkb79.java)

src/main/java/tool/tool.java

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,22 @@ public int comnination(int m, int n) {
1515
return (int) ans;
1616
}
1717

18+
19+
//预处理组合数
20+
static final int MOD = (int) 1e9 + 7, MX = (int) 1e4 + 1, MX_K = 14;
21+
static int[][] c = new int[MX + MX_K][MX_K + 1]; // 组合数
22+
23+
24+
//预处理组合数
25+
static {
26+
c[0][0] = 1;
27+
for (int i = 1; i < MX + MX_K; ++i) {
28+
c[i][0] = 1;
29+
for (int j = 1; j <= Math.min(i, MX_K); ++j)
30+
c[i][j] = (c[i - 1][j] + c[i - 1][j - 1]) % MOD;
31+
}
32+
}
33+
1834
long gcd(long a, long b) {
1935
while (b != 0) {
2036
long temp = a % b;
@@ -373,6 +389,7 @@ private void modify(SegmentTreeNode root, int index, int value) {
373389
root.sum = root.left.sum + root.right.sum;
374390
}
375391
}
392+
376393
public class SegmentTreeNode {
377394
public int start, end;
378395
public int max, min, sum; // You can add additional attributes

src/main/java/weekly/wk301.java

Lines changed: 182 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,182 @@
1+
package weekly;
2+
3+
import java.util.ArrayDeque;
4+
import java.util.ArrayList;
5+
import java.util.Arrays;
6+
import java.util.Comparator;
7+
import java.util.Deque;
8+
import java.util.List;
9+
import java.util.PriorityQueue;
10+
import java.util.TreeSet;
11+
12+
public class wk301 {
13+
14+
//ranking: 2372 / 7133 丢人 - -
15+
16+
//简单题,贪心,麻烦的做法,每次取两个最大的比较
17+
/* public int fillCups(int[] amount) {
18+
int res = 0;
19+
PriorityQueue<Integer> priorityQueue = new PriorityQueue<>(Comparator.reverseOrder());
20+
for (int i : amount) {
21+
if (i != 0)
22+
priorityQueue.add(i);
23+
}
24+
25+
while (priorityQueue.size() > 2) {
26+
Integer poll = priorityQueue.poll() - 1;
27+
Integer poll1 = priorityQueue.poll() - 1;
28+
res++;
29+
if (poll != 0)
30+
priorityQueue.add(poll);
31+
if (poll1 != 0)
32+
priorityQueue.add(poll1);
33+
}
34+
35+
if (!priorityQueue.isEmpty()) {
36+
res += priorityQueue.poll();
37+
}
38+
39+
40+
return res;
41+
}*/
42+
43+
//贪心
44+
public int fillCups(int[] amount) {
45+
Arrays.sort(amount);
46+
int x = amount[0], y = amount[1], z = amount[2];
47+
48+
if (x + y <= z) {
49+
return z;
50+
} else {
51+
int t = (x + y - z);
52+
if (t % 2 == 0) {
53+
return t / 2 + z;
54+
} else {
55+
return t / 2 + z + 1;
56+
}
57+
}
58+
}
59+
60+
61+
//中等题,哈希表,注意去重
62+
class SmallestInfiniteSet {
63+
64+
int min = 1;
65+
66+
TreeSet<Integer> priorityQueue = new TreeSet<>();
67+
68+
public SmallestInfiniteSet() {
69+
70+
}
71+
72+
public int popSmallest() {
73+
if (!priorityQueue.isEmpty()) {
74+
Integer first = priorityQueue.first();
75+
priorityQueue.remove(first);
76+
return first;
77+
}
78+
return min++;
79+
}
80+
81+
public void addBack(int num) {
82+
if (num < min) {
83+
priorityQueue.add(num);
84+
}
85+
}
86+
}
87+
88+
//中等题,思维题,双指针
89+
static public boolean canChange(String start, String target) {
90+
for (int i = 0, j = 0; ; i++, j++) {
91+
//跳过空格
92+
for (; i < start.length() && start.charAt(i) == '_'; i++) {
93+
}
94+
for (; j < target.length() && target.charAt(j) == '_'; j++) {
95+
}
96+
//全部检查完毕
97+
if (i == start.length() && j == target.length()) {
98+
return true;
99+
}
100+
//以下情况都不正确:
101+
//1.有一个遍历完成
102+
//2 . L匹配到R
103+
//3. target的L比start的L滞后 target的R比start的R提前
104+
if (i == start.length() || j == target.length() || start.charAt(i) != target.charAt(j)
105+
|| (start.charAt(i) == 'L' ? i < j : i > j)) {
106+
return false;
107+
}
108+
}
109+
}
110+
111+
112+
//直接dp超时
113+
/* static public int idealArrays(int n, int maxValue) {
114+
int mod = (int) 1e9 + 7;
115+
long[] dp = new long[maxValue + 1];
116+
for (int i = 1; i <= maxValue; i++) {
117+
dp[i] = 1;
118+
}
119+
120+
for (int i = 1; i < n; i++) {
121+
long[] ndp = new long[maxValue + 1];
122+
for (int j = 1; j <= maxValue; j++) {
123+
for (int k = 1; k * j <= maxValue; k++) {
124+
ndp[k * j] += dp[j];
125+
ndp[k * j] %= mod;
126+
}
127+
}
128+
dp = ndp;
129+
}
130+
long res = 0;
131+
for (long l : dp) {
132+
res += l;
133+
res %= mod;
134+
}
135+
return (int) res;
136+
}*/
137+
138+
static final int MOD = (int) 1e9 + 7, MX = (int) 1e4 + 1, MX_K = 14;
139+
static int[][] c = new int[MX + MX_K][MX_K + 1]; // 组合数
140+
141+
142+
//预处理组合数
143+
static {
144+
c[0][0] = 1;
145+
for (int i = 1; i < MX + MX_K; ++i) {
146+
c[i][0] = 1;
147+
for (int j = 1; j <= Math.min(i, MX_K); ++j)
148+
c[i][j] = (c[i - 1][j] + c[i - 1][j - 1]) % MOD;
149+
}
150+
}
151+
152+
//困难题,dp+排列组合,质因数分解,最多有14个质因数(n最大是10000),
153+
public int idealArrays(int n, int maxValue) {
154+
155+
//f[i][j]表示以i结尾的不同的质因数有j的个数
156+
int[][] f = new int[maxValue + 1][MX_K + 1];
157+
for (int i = 1; i <= maxValue; i++) {
158+
f[i][1] = 1;
159+
}
160+
for (int j = 0; j <= MX_K; j++) {
161+
for (int i = 1; i <= maxValue; i++) {
162+
for (int k = 2; k * i <= maxValue; k++) {
163+
f[k * i][j] = (f[k * i][j] + f[i][j - 1]) % MOD;
164+
}
165+
}
166+
}
167+
//排列组合,在n-1个位置选择k-1个位置插入质因数(0位置必须放一个质因数)
168+
long res = 0;
169+
for (int i = 1; i < f.length; i++) {
170+
for (int j = 1; j < f[0].length; j++) {
171+
res = (res + (long) f[i][j] * c[n - 1][j - 1]) % MOD;
172+
}
173+
}
174+
175+
return (int) res;
176+
}
177+
178+
public static void main(String[] args) {
179+
}
180+
181+
182+
}

src/main/java/weekly/wkb79.java

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -130,16 +130,16 @@ public BookMyShow(int n, int m) {
130130
public int[] gather(int k, int maxRow) {
131131
int i = index(1, 1, n, maxRow + 1, m - k);
132132
if (i == 0) return new int[]{}; // 不存在
133-
var seats = (int) query_sum(1, 1, n, i, i);
133+
int seats = (int) query_sum(1, 1, n, i, i);
134134
add(1, 1, n, i, k); // 占据 k 个座位
135135
return new int[]{i - 1, seats};
136136
}
137137

138138
public boolean scatter(int k, int maxRow) {
139139
if ((long) (maxRow + 1) * m - query_sum(1, 1, n, 1, maxRow + 1) < k) return false; // 剩余座位不足 k 个
140140
// 从第一个没有坐满的排开始占座
141-
for (var i = index(1, 1, n, maxRow + 1, m - 1); ; ++i) {
142-
var left_seats = m - (int) query_sum(1, 1, n, i, i);
141+
for (int i = index(1, 1, n, maxRow + 1, m - 1); ; ++i) {
142+
int left_seats = m - (int) query_sum(1, 1, n, i, i);
143143
if (k <= left_seats) { // 剩余人数不够坐后面的排
144144
add(1, 1, n, i, k);
145145
return true;
@@ -156,7 +156,7 @@ void add(int o, int l, int r, int idx, int val) {
156156
sum[o] += val;
157157
return;
158158
}
159-
var m = (l + r) / 2;
159+
int m = (l + r) / 2;
160160
if (idx <= m) add(o * 2, l, m, idx, val);
161161
else add(o * 2 + 1, m + 1, r, idx, val);
162162
//更新改点的最小值和sum
@@ -167,8 +167,8 @@ void add(int o, int l, int r, int idx, int val) {
167167
// 返回区间 [L,R] 内的元素和
168168
long query_sum(int o, int l, int r, int L, int R) { // L 和 R 在整个递归过程中均不变,将其大写,视作常量
169169
if (L <= l && r <= R) return sum[o];
170-
var sum = 0L;
171-
var m = (l + r) / 2;
170+
long sum = 0L;
171+
int m = (l + r) / 2;
172172
if (L <= m) sum += query_sum(o * 2, l, m, L, R);
173173
if (R > m) sum += query_sum(o * 2 + 1, m + 1, r, L, R);
174174
return sum;
@@ -179,7 +179,7 @@ long query_sum(int o, int l, int r, int L, int R) { // L 和 R 在整个递归
179179
int index(int o, int l, int r, int R, int val) { // R 在整个递归过程中均不变,将其大写,视作常量
180180
if (min[o] > val) return 0; // 说明整个区间的元素值都大于 val
181181
if (l == r) return l;
182-
var m = (l + r) / 2;
182+
int m = (l + r) / 2;
183183
if (min[o * 2] <= val) return index(o * 2, l, m, R, val); // 看看左半部分
184184
if (m < R) return index(o * 2 + 1, m + 1, r, R, val); // 看看右半部分
185185
return 0;

0 commit comments

Comments
 (0)