Skip to content

Commit fdc91ce

Browse files
committed
weekly contest 338
1 parent c6b09d6 commit fdc91ce

File tree

2 files changed

+202
-0
lines changed

2 files changed

+202
-0
lines changed

README.md

+2
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@ Record leetcode contest and ideas every week, and encourage yourself to think mo
55
leetcode url: <https://leetcode.cn/u/cctest/>
66

77

8+
9+
* ☀️ [weekly contest 338](src/main/java/weekly/wk338.java) 贪心 | 谈心 | 前缀和+二分 | 拓扑排序
810
* ☀️ [weekly contest 337](src/main/java/weekly/wk337.java) 模拟 | 模拟 | 回溯 | 同余分组
911
* 🐎️ [weekly contest 336](src/main/java/weekly/wk336.java) 模拟 | 排序 | 异或前缀和 | 贪心
1012
* 🐎️ [weekly contest 335](src/main/java/weekly/wk335.java) 模拟 | 层序遍历 | 质数分解 | 多重背包

src/main/java/weekly/wk338.java

+200
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,200 @@
1+
package weekly;
2+
3+
import java.util.ArrayList;
4+
import java.util.Arrays;
5+
import java.util.HashMap;
6+
import java.util.HashSet;
7+
import java.util.LinkedList;
8+
import java.util.List;
9+
import java.util.Map;
10+
import java.util.Queue;
11+
import java.util.Set;
12+
import java.util.TreeMap;
13+
import java.util.TreeSet;
14+
15+
public class wk338 {
16+
//贪心
17+
public int kItemsWithMaximumSum(int numOnes, int numZeros, int numNegOnes, int k) {
18+
if (numOnes >= k) {
19+
return k;
20+
} else if (numOnes + numZeros >= k) {
21+
return numOnes;
22+
} else {
23+
return numOnes - (k - numOnes - numZeros);
24+
}
25+
}
26+
27+
//贪心 减去能减的最大质数
28+
public boolean primeSubOperation(int[] nums) {
29+
int n = 1000;
30+
TreeSet<Integer> treeSet = new TreeSet<>();
31+
boolean[] Prime = new boolean[n];
32+
Prime[0] = true;
33+
for (int i = 2; i <= n; i++) {
34+
boolean isPrime = true;
35+
for (int j = 2; j <= i / 2; j++) {
36+
if (i % j == 0) {
37+
isPrime = false;
38+
break;
39+
}
40+
}
41+
if (isPrime) {
42+
Prime[i] = true;
43+
treeSet.add(i);
44+
}
45+
}
46+
for (int i = nums[0] - 1; i >= 0; i--) {
47+
if (Prime[i]) {
48+
nums[0] -= i;
49+
break;
50+
}
51+
}
52+
for (int i = 1; i < nums.length; i++) {
53+
boolean flag = false;
54+
for (int j = nums[i] - 1; j >= 0; j--) {
55+
if (Prime[j] && nums[i] - j > nums[i - 1]) {
56+
nums[i] -= j;
57+
flag = true;
58+
break;
59+
}
60+
}
61+
if (!flag) {
62+
return false;
63+
}
64+
}
65+
return true;
66+
}
67+
68+
69+
//前缀和+二分
70+
public List<Long> minOperations(int[] nums, int[] queries) {
71+
int[][] q = new int[queries.length][2];
72+
for (int i = 0; i < queries.length; i++) {
73+
q[i] = new int[]{queries[i], i};
74+
}
75+
Arrays.sort(q, (a, b) -> a[0] - b[0]);
76+
Arrays.sort(nums);
77+
78+
long[] res = new long[queries.length];
79+
80+
81+
int left = 0;
82+
long sum = 0;
83+
for (int i = 0; i < nums.length; i++) {
84+
if (nums[i] <= q[0][0]) {
85+
left++;
86+
sum += q[0][0] - nums[i];
87+
} else {
88+
sum += nums[i] - q[0][0];
89+
}
90+
}
91+
res[q[0][1]] = sum;
92+
93+
for (int i = 1; i < q.length; i++) {
94+
int dis = q[i][0] - q[i - 1][0];
95+
int count = 0;
96+
while (left + count < nums.length && nums[left + count] < q[i][0]) {
97+
sum += (q[i][0] - nums[left + count]) - (nums[left + count] - q[i - 1][0]);
98+
count++;
99+
100+
}
101+
102+
sum += ((long) left - (nums.length - left - count)) * dis;
103+
104+
res[q[i][1]] = sum;
105+
left += count;
106+
}
107+
List<Long> ans = new ArrayList<>();
108+
for (long re : res) {
109+
ans.add(re);
110+
}
111+
return ans;
112+
}
113+
114+
115+
//两次拓扑排序:一次从0一直找,一次从1找两次
116+
public int collectTheCoins(int[] coins, int[][] edges) {
117+
// 构建无向图
118+
int n = coins.length;
119+
int[] in = new int[coins.length];
120+
Map<Integer, List<Integer>> graph = new HashMap<>();
121+
for (int i = 0; i < n; i++) {
122+
graph.put(i, new ArrayList<>());
123+
}
124+
for (int[] edge : edges) {
125+
int u = edge[0], v = edge[1];
126+
graph.get(u).add(v);
127+
graph.get(v).add(u);
128+
in[u]++;
129+
in[v]++;
130+
}
131+
Queue<Integer> queue = new LinkedList<>();
132+
for (int i = 0; i < in.length; i++) {
133+
if (in[i] == 1) {
134+
queue.add(i);
135+
}
136+
}
137+
Set<Integer> remove = new HashSet<>();
138+
139+
help(remove, graph, in, coins);
140+
141+
help2(remove, graph, in, coins);
142+
143+
return 2 * (Math.max(0, coins.length - remove.size() - 1));
144+
}
145+
146+
//0遍历到底
147+
void help(Set<Integer> remove, Map<Integer, List<Integer>> graph, int[] in, int[] coins) {
148+
Queue<Integer> queue = new LinkedList<>();
149+
for (int i = 0; i < in.length; i++) {
150+
if (in[i] == 1 && coins[i] == 0) {
151+
queue.add(i);
152+
}
153+
}
154+
while (!queue.isEmpty()) {
155+
Integer cur = queue.poll();
156+
remove.add(cur);
157+
in[cur] = 0;
158+
for (Integer next : graph.getOrDefault(cur, new ArrayList<>())) {
159+
in[next]--;
160+
if (coins[next] == 0 && in[next] == 1) {
161+
queue.add(next);
162+
}
163+
}
164+
}
165+
}
166+
167+
void help2(Set<Integer> remove, Map<Integer, List<Integer>> graph, int[] in, int[] coins) {
168+
Queue<Integer> queue = new LinkedList<>();
169+
for (int i = 0; i < in.length; i++) {
170+
if (in[i] == 1 && coins[i] == 1) {
171+
queue.add(i);
172+
}
173+
}
174+
int step = 0;
175+
while (!queue.isEmpty()) {
176+
int size = queue.size();
177+
while (size-- > 0) {
178+
Integer cur = queue.poll();
179+
remove.add(cur);
180+
in[cur] = 0;
181+
for (Integer next : graph.getOrDefault(cur, new ArrayList<>())) {
182+
in[next]--;
183+
if (in[next] == 1) {
184+
queue.add(next);
185+
}
186+
}
187+
}
188+
step++;
189+
if (step >= 2) return;
190+
}
191+
}
192+
193+
public static void main(String[] args) {
194+
wk338 w = new wk338();
195+
w.collectTheCoins(new int[]{1, 0, 0, 1, 1, 0, 0, 0, 0, 1, 0, 0},
196+
new int[][]{{0, 1}, {1, 2}, {1, 3}, {2, 4}, {4, 5}, {5, 6}, {5, 7}, {4, 8}, {7, 9}, {7, 10}, {10, 11}});
197+
}
198+
199+
200+
}

0 commit comments

Comments
 (0)