Skip to content

Commit a039de4

Browse files
authored
Merge pull request #929 from AlgorithmWithGod/Ukj0ng
[20250919] BOJ / G5 / 현수막 걸기 / 한종욱
2 parents f056afd + 92881e3 commit a039de4

File tree

1 file changed

+80
-0
lines changed

1 file changed

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

0 commit comments

Comments
 (0)