·186 words·1 min
๐ ๋ฌธ์ ์ ๋ณด # ๋งํฌ: https://www.acmicpc.net/problem/31265 ๐ง ๊ด์ฐฐ ๋ฐ ์ ๊ทผ # ์ดํด๊ฐ ์กฐ๊ธ ์ด๋ ค์ด๋ฐ, ๊ฒฐ๊ตญ $N$๊ฐ์ ํ๋ จ ์ํฉ์์ $d$๊ฐ์ ํ๋ จ ๊ฐ์ด๋ฐ ํ๋๋ฅผ ๊ณ์ ๊ณ ๋ฅด๊ณ , ํ๋ จ ์๊ฐ์ ํฉ์ ์ต๋ํ ํ๊ณ ์ถ๋ค. ๋ฐฐ๋ญ ๋ฌธ์ ์ ๋น์ทํด๋ณด์ธ๋ค. $d$๊ฐ์ ์ ํ์ง๊ฐ $N$๋ฒ ์ฃผ์ด์ง๊ณ , ํ๋ จ์๊ฐ = ๋ฌด๊ฒ์ ํฉ์ ์ต๋ํ ํด์ผํ๋ค. ์ด? ๋์ด๋ธํ๊ฒ ํ๋ฉด ํฐ์ง๋? ๊ฐ ๋จ๊ณ๋ง๋ค ํด์ผํ๋ ์ฐ์ฐ๋์ $M * d_i$์ด๋ค. ์ด ์ฐ์ฐ๋์ $\sum\limits_{i = 1}^N M * d_i \leq 1000 M$ ์ด๋ ๊ด์ฐฎ์ ๊ฒ ๊ฐ๋ค. ์๋!!!!!!!! ์ํ๋ ธ๋ ํ๋ค ๊ฐ ํ๋ จ ์ํฉ์์ ์ ์ด๋ ํ๋์ ํ๋ จ์ ๊ณจ๋ผ ํ๋ จ ๊ณํ์ ๋ฃ์ผ๋ ค๊ณ ํ๋ค. ํ ํ๋ จ์ ์ฌ๋ฌ๋ฒ ์ฐ์ง ์๊ฒ $M$์ ๋ํด ์ญ์์ผ๋ก ๋๋ฉด์, ์ ์ฒ๋ฆฌํ์. ๐ป ํ์ด # ์ฝ๋ (C++): void solve(){ cin >> N >> M; rep(i, 0, N){ cin >> D[i]; tv[i].resize(D[i]); } rep(i, 0, N) rep(j, 0, D[i]) cin >> tv[i][j]; knapsack[0][0] = true; rep(i, 1, N+1) for(auto t: tv[i-1]) rrep(j, 0, M+1) if(j - t >= 0 && (knapsack[i-1][j-t] || knapsack[i][j-t])) knapsack[i][j] = true; rrep(j, 0, M+1) if(knapsack[N][j]){ cout << j; return; } cout << -1; } ๐ ๊ตฌํ ์ฝ๋ ์ ๊ธ
·335 words·2 mins
๐ ๋ฌธ์ ์ ๋ณด # ๋งํฌ: https://www.acmicpc.net/problem/30788 ๐ง ๊ด์ฐฐ ๋ฐ ์ ๊ทผ # ๋์นญ์ด๋์ ์ด๋ป๊ฒ ์ํ์ ์ผ๋ก ํํํ ์ ์์๊น?? ์ฌ์ด๊ฑฐ๋ถํฐ ํด๋ณด์. ์๋ ์ ์ด $(x, y)$์ ์์๋ค๋ฉด $90\degree$ ์ง์ ์ ๋์นญ์ํค๋ฉด $(-x, y)$ $45\degree$ ์ง์ ์ ๋์นญ์ํค๋ฉด $(y, x)$ $60\degree$ ์ง์ ์ ๋์นญ์ํค๋ฉด $y = \sqrt{3}x$์ ๋์นญ์ธ๊ฑฐ๋๊น… ์๋ ์ด๊ฑฐ ๋๋ฌด ๊น๋ค๋ก์ด๋ฐ? ํ๋ ฌ์ฐ์ฐ์ ํ๊ธฐ ์ซ์๋ฐ.. ๊ฐ๋๋ฅผ ๊ธฐ์ค์ผ๋ก ์๊ฐํด๋ณด๋๊ฒ๋ ์ข๊ฒ ๋ค. ๊ทน์ขํ๊ณ์ฒ๋ผ, ์๋ ์ ์ด $0\degree$์ ์์๋ค๋ฉด $60\degree$์ ๋ํด ๋์นญ์ํค๋ฉด $120\degree$์ $120\degree$์ ๋ํด ๋์นญ์ํค๋ฉด $240\degree$์ ์ด๋ฐ ๋๋์ธ ๊ฒ ๊ฐ๋ค. ๊ทธ๋ ๋ค๋ฉด ์์ 1๋ฒ์ $0\degree \rightarrow 120\degree \rightarrow 330 \degree \rightarrow 60 \degree \rightarrow 0$ ์ธ๊ฑฐ ๊ฐ๋ค! $45\degree = 225\degree$๋ผ๊ณ ์๊ฐํ๊ณ , ๊ฐ๊น์ด ๊ณณ์ ์ฐพ์์ ๋๋ฐฐ๋ก ๋๊ธฐ๊ณ , 360์ผ๋ก ๋ชจ๋๋ฌ๋ฅผ ์ทจํ์. ์, ์ด์ ํ๋ฒ์ฉ ์จ์ 0๋๋ก ๋์์ค๋๊ฑธ ์ด๋ป๊ฒ ๋ง๋ค์ง? $15\degree$๋ก ๋ง๋ค ์ ์๋๊ฑด $30\degree$ $x\degree$๋ฅผ $a$์ ๋์นญ์ด๋์ํค๋ฉด $(2a - x) \degree$๊ฐ ๋๋ ๊ฒ ๊ฐ๋ค! ์ด๊ฑธ ๋ $b$์ ๋์นญ์ด๋์ํค๋ฉด $(2b - (2a - x))\degree$ ์ธ๊ฑฐ๊ฐ๊ณ .. ๊ทธ๋ฌ๋ฉด ํ๋ง๋ก ๋ฐ๋์ด๊ฐ๋ฉด์ ๋ํด์ง๋๊น ๊ฒฐ๊ตญ ๋ชจ๋๋ฌ 360์ ๋ํด ๋ ๊ทธ๋ฃน์ผ๋ก ๋๋ ํฉ์ ์ผ์ ํ๊ฒ ๋ง์ถ ์ ์๋์ง์ ๋ํ ๋ฌธ์ ๋ก ๋ฐ๋๋ค. ๐ป ํ์ด # ์ฝ๋ (C++): void solve(){ int N; cin >> N; vector<int> A(N); rep(i, 0, N) cin >> A[i]; if(N%2){ cout << "NO"; return; } int sum = 0; for(auto x: A) sum += x; sum %= 360; DP[0][0][0] = true; rep(i, 0, N) rrep(j, 0, N) rep(k, 0, 360) if(DP[i][j][k]){ int nxt = (k + A[i]*2) % 360; DP[i+1][j+1][nxt] = true; DP[i+1][j][k] = true; } if(DP[N][N/2][sum] || DP[N][N/2][(sum + 180) % 360]){ cout << "YES\n"; vector<bool> used(N); int ci = N, cj = N/2, cs = sum; if(!DP[N][N/2][sum]) cs = (sum + 180) % 360; while(cj){ int prv = (cs - A[ci-1]*2) % 360; if(prv < 0) prv += 360; if(DP[ci-1][cj - 1][prv]){ used[ci-1] = true; ci--; cj--; cs = prv; } else ci--; } vector<int> v1, v2; rep(i, 0, N){ if(used[i]) v1.push_back(i+1); else v2.push_back(i+1); } rep(i, 0, N/2){ cout << v1[i] << ' ' << v2[i] << ' '; } } else cout << "NO"; } ๐ ๊ตฌํ ์ฝ๋ ์ ๊ธ
·244 words·2 mins
๐ ๋ฌธ์ ์ ๋ณด # ๋งํฌ: https://www.acmicpc.net/problem/30208 ๐ง ๊ด์ฐฐ ๋ฐ ์ ๊ทผ # ์
๋ฌด๋ค์ ์์๋๋ฌธ์, ์์ ๋กญ๊ฒ ์ ํํ์ง ๋ชปํ๋ ๊ฒฝ์ฐ๋ค์ด ์๊ธด๋ค. ์ด๊ฒ ์ด๋ค ๋๋์ด์ง? ![[Drawing 2026-02-07 15.51.45.excalidraw.png]] ์์ ์
๋ ฅ 1์ ์์๋ ๋ค์๊ณผ ๊ฐ๋ค. $1 \rightarrow 2 \rightarrow 3$์ ๋ณด์. $1$๊น์ง ์ํํด์ ์ค์๋ $w_1$, ์ฒ๋ฆฌ์๊ฐ $t_1$์ ์ป์ ์ ์๋ค. $2$๊น์ง ์ํํด์ ์ค์๋ $w_1 + w_2$, ์ฒ๋ฆฌ์๊ฐ $t_1 + t_2$๋ฅผ ์ป์ ์ ์๋ค. $3$๊น์ง ์ํํด์ $\cdots$ ์ ๋ ๊ฒ ๋ฌผ๊ฑด์ ๋ง๋ค๊ณ ๋๋ฉด, ์ธ๊ฐ์ค์์ ํ1์ ํ๋๊ฒ ๋นผ๊ณ ๋ ๋ฐฐ๋ญ๋ฌธ์ ์ ๋์ผํด์ง๋ค. ํธ๋ฆฌ dfs๋ก ๋
์์ ์ ๋๋ฉด์ DP๋ฅผ ํ ์ ์์ ๊ฒ ๊ฐ๋ค. ๊ทผ๋ฐ ์์์ ๋ถ๊ธฐ๊ฐ ์ผ์ด๋๋ฉด… 0์ด ์๋ ๋ชจ๋ $p_i$๋ค์ ๋ชจ๋ ๋ค๋ฅด๋ค ๋ผ๋ ๋ฌธ์ฅ์ด ์
๋ ฅ์ ์๋ค. ๐ป ํ์ด # ์ฝ๋ (C++): void dfs(int cur, int root, int w, int t){ w += W[cur]; t += T[cur]; bags[root].push_back({w, t}); for(auto nxt: links[cur]) dfs(nxt, root, w, t); } void solve(){ cin >> N >> S; rep(i, 1, N+1) cin >> W[i]; rep(i, 1, N+1) cin >> T[i]; rep(i, 1, N+1){ int p; cin >> p; links[p].push_back(i); } for(auto nxt: links[0]) dfs(nxt, nxt, 0, 0); rep(i, 0, N+2) rep(j, 0, S+1) KS[i][j] = 1e9; KS[0][0] = 0; rep(i, 0, N+1) rep(j, 0, S+1) { KS[i+1][j] = min(KS[i+1][j], KS[i][j]); for(auto [w, t]: bags[i]){ int nxt = min(S, j + w); // } KS[i+1][nxt] = min(KS[i+1][nxt], KS[i][j] + t); } } if(KS[N+1][S] == 1e9) cout << -1; else cout << KS[N+1][S]; } ๐ ๊ตฌํ ์ฝ๋ ์ ๊ธ
·212 words·1 min
๐ ๋ฌธ์ ์ ๋ณด # ๋งํฌ: https://www.acmicpc.net/problem/4013 ๐ง ๊ด์ฐฐ ๋ฐ ์ ๊ทผ # ๊ทธ๋ํ๊ฐ DAG๋ผ๋ฉด ์์์ ๋ ฌ์ ํ๋ฉด์ DP๋ฅผ ์งํํ ์ ์์ํ
๋ฐ.. ๊ฐ์ ์ ์ ์ ์ฌ๋ฌ๋ฒ ๋ค๋ฆด ์ ์์ผ๋ฏ๋ก, ์ด๋ค ์ ์ ์ด ์ฌ์ดํด ์์ ๋ค์ด์๋ค๋ฉด ํด๋น ์ฌ์ดํด ๋ด์ ATM์ ๋ชจ๋ ๋ค๋ฆด ์ ์๋ค! ์๋ก ์์ ๋กญ๊ฒ ์ด๋ ๊ฐ๋ฅํ ๊ด๊ณ๋ผ๋ฉด ๋ชจ๋ ์์ ๋กญ๊ฒ ๋ค๋ฆด ์ ์์ผ๋ฏ๋ก, ์ด๋ฅผ SCC๋ก ๋ฌถ์ด DAG๋ก ๋ง๋ค์. ๐ป ํ์ด # ์ฝ๋ (C++): void solve(){ cin >> N >> M; DirectedGraph graph(N+1); rep(i, 0, M){ int u, v; cin >> u >> v; graph.add_edge(u, v); } DirectedGraph dag = graph.getCompressedGraph(); int sz = dag.V; vector<int> val(sz), DP(sz, -1e9), indeg(sz, 0); rep(i, 1, N+1){ int X; cin >> X; val[graph.sccId[i]] += X; } int S, P; cin >> S >> P; S = graph.sccId[S]; DP[S] = val[S]; rep(u, 0, sz) for(auto &v: dag.links[u]) indeg[v]++; queue<int> Q; rep(i, 0, sz) if(indeg[i] == 0) Q.push(i); while(!Q.empty()){ int cur = Q.front(); Q.pop(); for(auto nxt: dag.links[cur]){ DP[nxt] = max(DP[nxt], DP[cur] + val[nxt]); indeg[nxt]--; if(indeg[nxt] == 0) Q.push(nxt); } } int ans = 0; rep(i, 0, P){ int X; cin >> X; X = graph.sccId[X]; ans = max(ans, DP[X]); } cout << ans << '\n'; } ๐ ๊ตฌํ ์ฝ๋ ์ ๊ธ
·796 words·4 mins
๐ ๋ฌธ์ ์ ๋ณด # ๋งํฌ: ๋ฒ์ญ ๋ฌธ์ # Farmer John์ ์๋ค์ ๋ฐฉ๋ชฉ ํจํด์ ๋ ์ ๊ด๋ฆฌํ๊ธฐ ์ํด ๋์ฅ ์ ์ฒด์ ์ผ๋ฐฉํตํ ์ ๊ธธ๋ค์ ์ค์นํ์ต๋๋ค. ๋์ฅ์ N๊ฐ์ ๋ชฉ์ด์ง๋ก ๊ตฌ์ฑ๋์ด ์์ผ๋ฉฐ, ํธ์์ 1๋ถํฐ N๊น์ง ๋ฒํธ๊ฐ ๋งค๊ฒจ์ ธ ์๊ณ , ๊ฐ ์ผ๋ฐฉํตํ ์ ๊ธธ์ ํ ์์ ๋ชฉ์ด์ง๋ฅผ ์ฐ๊ฒฐํฉ๋๋ค. ์๋ฅผ ๋ค์ด, ๋ชฉ์ด์ง X์์ ๋ชฉ์ด์ง Y๋ก ์ฐ๊ฒฐ๋๋ ๊ธธ์ด ์๋ค๋ฉด, ์๋ค์ X์์ Y๋ก๋ ์ด๋ํ ์ ์์ง๋ง Y์์ X๋ก๋ ์ด๋ํ ์ ์์ต๋๋ค.
·698 words·4 mins
๐ ๋ฌธ์ ์ ๋ณด # ๋งํฌ: https://www.acmicpc.net/problem/32607 ๋ฒ์ญ ํ๋ก๋์ธ ๋ฐ๋ฌผ๊ด ๋ฐฉ๋ฌธ ๋ฌธ์ # ํ๋ก๋์ธ ๋ฐ๋ฌผ๊ด์์๋ ๋งค์ผ์ด ๋ค๋ฆ
๋๋ค. ์ด๋ค ๋ ์ ์ข๊ณ ํํ๋กญ๊ณ ์กฐ์ฉํด์, ํ๋ฃจ ์ข
์ผ ์๋ฆ๋ค์ด ๊ทธ๋ฆผ, ์กฐ๊ฐ, ๊ทธ๋ฆฌ๊ณ ๋ค๋ฅธ ์์ ์ํ๋ค์ ๊ฐ์ํ ์ ์์ต๋๋ค. ๋ค๋ฅธ ๋ ๋ค์ ๋ ๋ฐ์๋ฐ, ์ฃผ๋ง์ด๋ ๊ณตํด์ผ์๋ ์๋๋ฅด๋ ๋ฐฉ๋ฌธ๊ฐ๋ค, ๋์์ง ์
์ฅ๋ฃ, ๊ทธ๋ฆฌ๊ณ ์๋ฆฌ์ง๋ฅด๋ ์์ด๋ค๋ก ๋ฐ๋ฌผ๊ด์ด ๊ฐ๋ ์ฐน๋๋ค. ์ด๋ฌํ ๋ถํธํจ์ ๋งค์ฐ ๋ค์ํฉ๋๋ค: ์ด๋ค ๋ฐ์ ๋ ์ ์ถ๊ฐ ํ์ ํ ์ธ(studentenkorting) ๋๋ถ์ ๋ ๋์ ์ ์๊ณ , ์ด๋ค ์กฐ์ฉํ ๋ ์ ์ง์ง ์ํ ๋๋ฌธ์ ๋ ๋๋น ์ง ์ ์์ต๋๋ค.