Skip to content

Commit 365aa0f

Browse files
authored
Merge pull request #1722 from AlgorithmWithGod/zinnnn37
[20251221] BOJ / G5 / 현수막 걸기 / 김민진
2 parents 200e1b6 + e0cf155 commit 365aa0f

File tree

1 file changed

+77
-0
lines changed

1 file changed

+77
-0
lines changed
Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,77 @@
1+
```java
2+
import java.io.*;
3+
import java.util.Arrays;
4+
import java.util.StringTokenizer;
5+
6+
public class BJ_30459_현수막_걸기 {
7+
8+
private static final BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
9+
private static final BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
10+
private static StringTokenizer st;
11+
12+
private static int N, M, R;
13+
private static int[] piles, flagpoles;
14+
15+
public static void main(String[] args) throws IOException {
16+
init();
17+
sol();
18+
}
19+
20+
private static void init() throws IOException {
21+
st = new StringTokenizer(br.readLine());
22+
N = Integer.parseInt(st.nextToken());
23+
M = Integer.parseInt(st.nextToken());
24+
R = Integer.parseInt(st.nextToken());
25+
26+
piles = new int[N];
27+
st = new StringTokenizer(br.readLine());
28+
for (int i = 0; i < N; i++) {
29+
piles[i] = Integer.parseInt(st.nextToken());
30+
}
31+
32+
flagpoles = new int[M];
33+
st = new StringTokenizer(br.readLine());
34+
for (int i = 0; i < M; i++) {
35+
flagpoles[i] = Integer.parseInt(st.nextToken());
36+
}
37+
Arrays.sort(flagpoles);
38+
}
39+
40+
private static void sol() throws IOException {
41+
double maxArea = -1;
42+
for (int i = 0; i < N; i++) {
43+
for (int j = i + 1; j < N; j++) {
44+
int bottom = Math.abs(piles[i] - piles[j]);
45+
double maxHeight = 2.0 * R / bottom;
46+
47+
int idx = upperBound(maxHeight) - 1;
48+
if (idx >= 0) {
49+
double area = flagpoles[idx] * bottom / 2.0;
50+
maxArea = Math.max(maxArea, area);
51+
}
52+
}
53+
}
54+
bw.write(maxArea > 0 ? String.format("%.1f", maxArea) : "-1");
55+
bw.flush();
56+
bw.close();
57+
br.close();
58+
}
59+
60+
private static int upperBound(double target) {
61+
int left = 0;
62+
int right = flagpoles.length;
63+
64+
while (left < right) {
65+
int mid = left + (right - left) / 2;
66+
67+
if (flagpoles[mid] > target) {
68+
right = mid;
69+
} else {
70+
left = mid + 1;
71+
}
72+
}
73+
return left;
74+
}
75+
76+
}
77+
```

0 commit comments

Comments
 (0)