Skip to content

Commit e6497d1

Browse files
authored
[20250221] BOJ / P5 / 회전 테이블 / 권혁준
1 parent 1b9d59b commit e6497d1

File tree

1 file changed

+109
-0
lines changed

1 file changed

+109
-0
lines changed
Lines changed: 109 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,109 @@
1+
```cpp
2+
3+
#include <iostream>
4+
#include <queue>
5+
#include <tuple>
6+
#include <algorithm>
7+
using namespace std;
8+
using ll = long long;
9+
10+
ll N;
11+
ll S[3]{};
12+
ll A[101][3]{};
13+
ll dp[101][101][101][3][2]{};
14+
15+
// 시계 (b -> a)
16+
ll cal1(ll a, ll b) { return b >= a ? b - a : b + N - a; }
17+
// 반시계 (b -> a)
18+
ll cal2(ll a, ll b) { return a >= b ? a - b : a + N - b; }
19+
20+
int main()
21+
{
22+
cin.tie(0)->sync_with_stdio(0);
23+
24+
cin >> N;
25+
int K = N / 3;
26+
for (int i = 0; i < 3; i++) {
27+
cin >> S[i];
28+
for (int j = 1; j <= S[i]; j++) {
29+
cin >> A[j][i];
30+
if (i == 1) A[j][i] = (A[j][i] + 2 * K) % N;
31+
else if (i == 2) A[j][i] = (A[j][i] + K) % N;
32+
if (A[j][i] == 0) A[j][i] = N;
33+
}
34+
}
35+
36+
dp[1][0][0][0][0] = cal1(A[1][0], 1);
37+
dp[1][0][0][0][1] = cal2(A[1][0], 1);
38+
dp[0][1][0][1][0] = cal1(A[1][1], 1);
39+
dp[0][1][0][1][1] = cal2(A[1][1], 1);
40+
dp[0][0][1][2][0] = cal1(A[1][2], 1);
41+
dp[0][0][1][2][1] = cal2(A[1][2], 1);
42+
43+
for (int a = 0; a <= S[0]; a++) for (int b = 0; b <= S[1]; b++) for (int c = 0; c <= S[2]; c++) {
44+
if (a + b + c <= 1) continue;
45+
ll &res1 = dp[a][b][c][0][0];
46+
ll &res2 = dp[a][b][c][0][1];
47+
ll &res3 = dp[a][b][c][1][0];
48+
ll &res4 = dp[a][b][c][1][1];
49+
ll &res5 = dp[a][b][c][2][0];
50+
ll &res6 = dp[a][b][c][2][1];
51+
res1 = 1e18;
52+
res2 = 1e18;
53+
res3 = 1e18;
54+
res4 = 1e18;
55+
res5 = 1e18;
56+
res6 = 1e18;
57+
58+
if (a > 0) {
59+
ll t1 = min(dp[a - 1][b][c][0][0], dp[a - 1][b][c][0][1]);
60+
ll t2 = min(dp[a - 1][b][c][1][0], dp[a - 1][b][c][1][1]);
61+
ll t3 = min(dp[a - 1][b][c][2][0], dp[a - 1][b][c][2][1]);
62+
63+
ll v1 = 1e18;
64+
if (a - 1 > 0) res1 = min(res1, t1 + cal1(A[a][0], A[a - 1][0]));
65+
if (b > 0) res1 = min(res1, t2 + cal1(A[a][0], A[b][1]));
66+
if (c > 0) res1 = min(res1, t3 + cal1(A[a][0], A[c][2]));
67+
ll v2 = 1e18;
68+
if (a - 1 > 0) res2 = min(res2, t1 + cal2(A[a][0], A[a - 1][0]));
69+
if (b > 0) res2 = min(res2, t2 + cal2(A[a][0], A[b][1]));
70+
if (c > 0) res2 = min(res2, t3 + cal2(A[a][0], A[c][2]));
71+
}
72+
if (b > 0) {
73+
ll t1 = min(dp[a][b - 1][c][0][0], dp[a][b - 1][c][0][1]);
74+
ll t2 = min(dp[a][b - 1][c][1][0], dp[a][b - 1][c][1][1]);
75+
ll t3 = min(dp[a][b - 1][c][2][0], dp[a][b - 1][c][2][1]);
76+
77+
ll v1 = 1e18;
78+
if (a > 0) res3 = min(res3, t1 + cal1(A[b][1], A[a][0]));
79+
if (b - 1 > 0) res3 = min(res3, t2 + cal1(A[b][1], A[b - 1][1]));
80+
if (c > 0) res3 = min(res3, t3 + cal1(A[b][1], A[c][2]));
81+
ll v2 = 1e18;
82+
if (a > 0) res4 = min(res4, t1 + cal2(A[b][1], A[a][0]));
83+
if (b - 1 > 0) res4 = min(res4, t2 + cal2(A[b][1], A[b - 1][1]));
84+
if (c > 0) res4 = min(res4, t3 + cal2(A[b][1], A[c][2]));
85+
}
86+
if (c > 0) {
87+
ll t1 = min(dp[a][b][c - 1][0][0], dp[a][b][c - 1][0][1]);
88+
ll t2 = min(dp[a][b][c - 1][1][0], dp[a][b][c - 1][1][1]);
89+
ll t3 = min(dp[a][b][c - 1][2][0], dp[a][b][c - 1][2][1]);
90+
91+
ll v1 = 1e18;
92+
if (a > 0) res5 = min(res5, t1 + cal1(A[c][2], A[a][0]));
93+
if (b > 0) res5 = min(res5, t2 + cal1(A[c][2], A[b][1]));
94+
if (c - 1 > 0) res5 = min(res5, t3 + cal1(A[c][2], A[c - 1][2]));
95+
ll v2 = 1e18;
96+
if (a > 0) res6 = min(res6, t1 + cal2(A[c][2], A[a][0]));
97+
if (b > 0) res6 = min(res6, t2 + cal2(A[c][2], A[b][1]));
98+
if (c - 1 > 0) res6 = min(res6, t3 + cal2(A[c][2], A[c - 1][2]));
99+
}
100+
101+
}
102+
103+
ll ans = 2e18;
104+
for (int i = 0; i < 3; i++) for (int j = 0; j < 2; j++) ans = min(ans, dp[S[0]][S[1]][S[2]][i][j]);
105+
cout << ans;
106+
107+
}
108+
109+
```

0 commit comments

Comments
 (0)