Skip to content

Commit adddd88

Browse files
committed
weekly contest 316
1 parent ae6a760 commit adddd88

File tree

2 files changed

+177
-1
lines changed

2 files changed

+177
-1
lines changed

README.md

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,10 @@ 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 316](src/main/java/weekly/wk316.java) 模拟 | gcd | 前缀和 | 分情况
79
* ☀️ [weekly contest 315](src/main/java/weekly/wk315.java) Hash表 | Hash表 | 暴力 | 双指针
8-
* 🐼 [weekly contest 314](src/main/java/weekly/wk312.java) 数组 | 异或运算 | 贪心+栈 | DP
10+
* 🐼 [weekly contest 314](src/main/java/weekly/wk314.java) 数组 | 异或运算 | 贪心+栈 | DP
911
* 🐑 [weekly contest 312](src/main/java/weekly/wk312.java) 排序 | 脑筋急转弯 | 前缀和 | 并查集
1012
* 🐑 [weekly contest 311](src/main/java/weekly/wk311.java) 规律 | 滑动窗口 | 层序遍历 | 字典树
1113
* 🐑 [weekly contest 310](src/main/java/weekly/wk310.java) 排序、hash表 | 贪心 | 贪心、差分数组 | 线段树+区间最大值

src/main/java/weekly/wk316.java

Lines changed: 174 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,174 @@
1+
package weekly;
2+
3+
import java.text.ParseException;
4+
import java.text.SimpleDateFormat;
5+
import java.time.LocalTime;
6+
import java.util.ArrayList;
7+
import java.util.Arrays;
8+
import java.util.Date;
9+
import java.util.HashMap;
10+
import java.util.List;
11+
import java.util.Map;
12+
import java.util.PriorityQueue;
13+
14+
public class wk316 {
15+
16+
//ranking: 942 / 6387
17+
18+
//又是这种时间题
19+
public boolean haveConflict(String[] event1, String[] event2) {
20+
21+
return event1[0].compareTo(event2[1]) <= 0 && event1[1].compareTo(event2[0]) >= 0;
22+
23+
}
24+
25+
// boolean check(LocalTime a, LocalTime b, LocalTime c, LocalTime d) {
26+
// if (b.compareTo(c) >= 0 && b.compareTo(d) <= 0) return true;
27+
// if (d.compareTo(a) >= 0 && d.compareTo(b) <= 0) return true;
28+
// return false;
29+
// }
30+
31+
32+
//暴力写的
33+
public int subarrayGCD(int[] nums, int k) {
34+
int ans = 0;
35+
for (int i = 0; i < nums.length; i++) {
36+
int g = 0;
37+
for (int j = i; j < nums.length; j++) {
38+
g = gcd(g, nums[j]);
39+
if (g == k) ans += 1;
40+
if (g % k > 0) break;
41+
}
42+
}
43+
return ans;
44+
}
45+
46+
int gcd(long a, long b) {
47+
while (b != 0) {
48+
long temp = a % b;
49+
a = b;
50+
b = temp;
51+
}
52+
return (int) a;
53+
}
54+
55+
56+
//前缀和容易考虑一点, 但也可以直接考虑sum
57+
/* public long minCost(int[] nums, int[] cost) {
58+
long[][] pack = new long[nums.length][2];
59+
for (int i = 0; i < nums.length; i++) {
60+
pack[i] = new long[]{nums[i], cost[i]};
61+
}
62+
Arrays.sort(pack, (a, b) -> Long.compare(a[0], b[0]));
63+
64+
long res = 0;
65+
for (int i = 1; i < pack.length; i++) {
66+
res += (pack[i][0] - pack[0][0]) * pack[i][1];
67+
}
68+
for (int i = 1; i < pack.length; i++) {
69+
pack[i][1] += pack[i - 1][1];
70+
}
71+
long ans = Long.MAX_VALUE;
72+
for (int i = 1; i < pack.length; i++) {
73+
res += (pack[i][0] - pack[i - 1][0]) * (pack[i - 1][1] - (pack[nums.length - 1][1] - pack[i - 1][1]));
74+
ans = Math.min(ans, res);
75+
}
76+
return ans;
77+
}*/
78+
//不用前缀和
79+
public long minCost(int[] nums, int[] cost) {
80+
long[][] pack = new long[nums.length][2];
81+
for (int i = 0; i < nums.length; i++) {
82+
pack[i] = new long[]{nums[i], cost[i]};
83+
}
84+
Arrays.sort(pack, (a, b) -> Long.compare(a[0], b[0]));
85+
86+
long res = 0;
87+
long sumCost=pack[0][1];
88+
for (int i = 1; i < pack.length; i++) {
89+
res += (pack[i][0] - pack[0][0]) * pack[i][1];
90+
sumCost+=pack[i][1];
91+
}
92+
long ans = res;
93+
for (int i = 1; i < pack.length; i++) {
94+
sumCost-=2*pack[i-1][1];
95+
res -= (pack[i][0] - pack[i - 1][0]) * sumCost;
96+
ans = Math.min(ans, res);
97+
}
98+
return ans;
99+
}
100+
101+
102+
//分奇数偶数考虑,要分很多情况
103+
/* public long makeSimilar(int[] nums, int[] target) {
104+
List<Integer> nums1 = new ArrayList<>();
105+
List<Integer> nums2 = new ArrayList<>();
106+
List<Integer> target1 = new ArrayList<>();
107+
List<Integer> target2 = new ArrayList<>();
108+
Arrays.sort(nums);
109+
Arrays.sort(target);
110+
for (int i = 0; i < nums.length; i++) {
111+
if (nums[i] % 2 == 1) {
112+
nums1.add(nums[i]);
113+
} else {
114+
nums2.add(nums[i]);
115+
}
116+
if (target[i] % 2 == 1) {
117+
target1.add(target[i]);
118+
} else {
119+
target2.add(target[i]);
120+
}
121+
}
122+
long[] a = help(nums1, target1, 0, 0);
123+
long[] b = help(nums2, target2, a[1], a[2]);
124+
System.out.println(a + " " + b);
125+
return a[0] + b[0];
126+
}
127+
128+
long[] help(List<Integer> nums, List<Integer> target, long up, long down) {
129+
long count = 0;
130+
for (int i = 0; i < nums.size(); i++) {
131+
int a = nums.get(i), b = target.get(i);
132+
if (a > b) {
133+
int need = (a - b) / 2;
134+
if (down >= need) {
135+
down -= need;
136+
} else {
137+
count += (need - down);
138+
up += (need - down);
139+
down = 0;
140+
}
141+
142+
} else if (a < b) {
143+
int need = (b - a) / 2;
144+
if (up >= need) {
145+
up -= need;
146+
} else {
147+
count += (need - up);
148+
down += (need - up);
149+
up = 0;
150+
}
151+
}
152+
}
153+
return new long[]{count, up, down};
154+
}*/
155+
156+
157+
//大佬的做法,把奇数变成负数,区分奇偶,然后计算绝对值差,最后/4即可,因为题目说一定有答案
158+
public long makeSimilar(int[] nums, int[] target) {
159+
f(nums);
160+
f(target);
161+
long ans = 0L;
162+
for (int i = 0; i < nums.length; ++i)
163+
ans += Math.abs(nums[i] - target[i]);
164+
return ans / 4;
165+
}
166+
167+
private void f(int[] a) {
168+
// 由于元素都是正数,把奇数变成相反数,这样排序后奇偶就自动分开了
169+
for (int i = 0; i < a.length; ++i)
170+
if (a[i] % 2 != 0) a[i] = -a[i];
171+
Arrays.sort(a);
172+
}
173+
174+
}

0 commit comments

Comments
 (0)