·209 words·1 min
๐ ๋ฌธ์ ์ ๋ณด # ๋งํฌ: https://www.acmicpc.net/problem/5638 ๐ง ๊ด์ฐฐ ๋ฐ ์ ๊ทผ # ๋์ ์๋ฌธ์ด ์๊ณ , ์ ๋๊ณผ ํผํด๋น์ฉ์ด ์๋ ๊ฒ ๊ฐ๋ค. ํผํด๋น์ฉ์ ์ฌ๋ ์๊ฐ์ ๋น๋กํ์ง ์๋ ๊ฒ ๊ฐ๋ค. ๊ทธ๋ฌ๋ฉด ๊ฐ ์๋ฌธ์ ๋ํด, ์ ๋์ ์๊ฐ์ ๊ณฑํด์ ๊ฐ ์๋ฌธ์ด ๋ฒ๋ฆด ์ ์๋ ๋ฌผ์ ์์ ๊ตฌํ ์ ์๊ณ , ๊ทธ์ ๋ฐ๋ฅธ ๊ฐ๊ฒฉ์ด ๋์จ๋ค. ์ด๊ฑด ๊ทธ๋ฆฌ๋ํ๊ฒ๋ ์กฐ๊ธ ๊ณค๋ํ๊ณ , ๋ฐฐ๋ญ ๋ฌธ์ ๋ก ๋๋? ํ๋๋ฐ, $V$๊ฐ ๋๋ฌด ํฌ๋ค! ๊ทธ๋ฐ๋ฐ ์๋ฌธ์ ๊ฐ์๊ฐ $n \leq 20$์ผ๋ก ์ ์๋ฏธํ๊ฒ ์๋ค. ๊ฐ ํ
์คํธ์ผ์ด์ค์ ๋ํด ๋ชจ๋ ์๋ฌธ์ ์ด์ด๋ณด๋ ๊ฒฝ์ฐ์ ์๋ฅผ ์ํํ ์ ์์ ๊ฒ ๊ฐ๋ค. ์๊ฐ๋ณต์ก๋ $O(2^n \cdot nm)$ ์ ๋์ ๋์ํ ๊ฒ ๊ฐ๋ค. ๐ป ํ์ด # ์ฝ๋ (C++): void solve(){ int N; cin >> N; vector<pll> door(N); rep(i, 0, N) cin >> door[i].first >> door[i].second; int Q; cin >> Q; rep(q, 1, Q+1){ ll V, T; cin >> V >> T; ll ans = 1e18; rep(bit, 0, 1<<N){ ll wat = 0, cost = 0; rep(i, 0, N) if(bit & (1<<i)) wat += door[i].first*T, cost += door[i].second; if(wat >= V) ans = min(ans, cost); } cout << "Case " << q << ": "; if(ans == 1e18) cout << "IMPOSSIBLE\n"; else cout << ans << '\n'; } } ๐ ๊ตฌํ ์ฝ๋ ์ ๊ธ
·510 words·3 mins
๐ ๋ฌธ์ ์ ๋ณด # ๋งํฌ: https://www.acmicpc.net/problem/15896 ๐ง ๊ด์ฐฐ ๋ฐ ์ ๊ทผ # bitwise and๋ค์ ํฉ๊ณผ, ํฉ๋ค์ bitwise and ๊ฐ์ ๊ตฌํด์ผํ๋ค. ์ผ๋จ ์์๊ป๋ถํฐ ํด๋ณด์. $N$์ 100๋ง??์ด๋ค. ๊ฐํฌ๋ค ๋ชจ๋ $(A_i \& B_j)$์ ํฉ์ 1999๋ก ๋๋ ๋๋จธ์ง ๋์ด๋ธํ๊ฒ ์ ๊ณฑ์ ๋ ๋ฆฌ๊ฐ ์๋ค. bitwise and์ ํน์ฑ์ ์๊ฐํด๋ณด์. $A_i$์์๋, $B_j$์์๋ ์ผ์ ธ์์ด์ผ ํ๋ค. ๊ฐ ๋นํธ์ ๋ํด์ ์๊ฐํ๋ฉด, $A$์์ ํด๋น ๋นํธ๊ฐ ์ผ์ง ๊ฐ์ * $B$์์ ํด๋น ๋นํธ๊ฐ ์ผ์ง ๊ฐ์์ ๊ฐ์ด ๊ตฌํ ์ ์์ ๊ฒ ๊ฐ๋ค. ์ ์ฒ๋ฆฌ์ $O(N\times29)$, ๊ณ์ฐํ๋๋ฐ์ $O(29)$๊ฐ ๊ฑธ๋ฆด ๊ฒ ๊ฐ๋ค. ๋ชจ๋ $(A_iย +ย B_j)$์ bitwise and ์ฐ์ฐ ๊ฐ ์ ์ด์ ์ด๊ฒ ๋ฌธ์ ๊ฑฐ๊ฐ์๋ฐ… ํฉ์ด ์ด์๋ค. ๋ฐ์์ฌ๋ฆผ์ด ์๋ค๋ณด๋ ์กฐ๊ธ ์ ๊ฒฝ์ฐ์ธ๋ค. ๋ค์ํ๋ฒ bitwise and์ ํน์ฑ์ ์๊ฐํด๋ณด์. ๋ชจ๋ ์ผ์ ธ์์ด์ผ ํ๋ค๋๊ฑด, ๋ชจ๋ ์์์ $(i, j)$์ ๋ํด $A_i + B_j = C_k$๋ผ๊ณ ํ ๋, ์ด๋ค $C_k$์ ๋นํธ๊ฐ ๊บผ์ ธ์์ผ๋ฉด, ์ ๋ต์์ ํด๋น ๋นํธ๋ ๊บผ์ง๋ค. ์ผ๋จ ์ฒซ๋ฒ์งธ ๋นํธ์ ๋ํด์๋ ์ฝ๊ฒ ๊ตฌํ ์ ์๋ ๊ฒ ๊ฐ๋ค. ๋ํ์๋ ๋ชจ๋ $1$์ด ๋จ๊ธฐ ์ํด์ $1 + 0, 0 + 1$ ๋๊ฐ์ง๋ง ๊ฐ๋ฅํ๊ธฐ์, ๊ฐ์๊ฐ $(N, 0), (0, N)$์ด ์๋๋ผ๋ฉด ๋นํธ๊ฐ ๊บผ์ง ์๋ฐ์ ์๋ค. ํ์ง๋ง ํด๋น ์ ๋นํธ๋ถํฐ๋ ๋ฐ์์ฌ๋ฆผ์ด ์๊ธด๋ค… $11_2 + 01_2 = 100_2$ ์ ๊ฐ์ด $(1, 0)$์ด์์์๋ ๋นํธ๊ฐ ๊บผ์ง ์ ์๋ค. ํน์ $11_2 + 11_2 = 110_2$์ ๊ฐ์ด $(1, 1)$์ด์์ผ๋ฉ๋ ๋นํธ๊ฐ ์ผ์ง ์ ์๋ค. ํ ์ด๊ฒ ๋ฌด์จ ์๋ฏธ์ง? ์๋ฅผ๋ค์ด $4$์์๋ฆฌ ๋นํธ๊ฐ ์ผ์ ธ์๋? ๋ผ๋ ์ง๋ฌธ์ $8$๋ก ๋๋ ๋๋จธ์ง๋ค์ ํฉ์ ๋ํด, ๋๋จธ์ง๊ฐ ๋ชจ๋ $4$ ์ด์์ธ๊ฐ? ํ๋ ์ง๋ฌธ๊ณผ ๊ฐ๊ธด ํ๋ค. $0$$3$, $8$$11$์ ์๋๋ค๋๊ฑฐ์ง. ๊ทธ ์ฌ์ด์ ๊ฐ์ด ์๋์ง ์๋์ง๋ฅผ ์ฒดํฌํ ์๊ฐ ์๋? ์ผ๋ฐํ์ํค๋ฉด, $2^k$์ ๋นํธ๊ฐ ์ผ์ ธ์๋๊ฑด $\mod 2^{k+1}$ ์ ๋ํด ๋๋ ์ ๋ค์ ํฉ์ ๋ํด $0 \leq s < 2^k$ ๋๋ $2^{k+1} \leq s < 2^{k+1} + 2^k$ ์ธ๊ฒ ์์ผ๋ฉด ์๋๋ค. ์ด๊ฑธ ๊ฐ ๋นํธ์ ๋ํด ํ๋ค๊ณ ํ๋ฉด ๊ทธ๋๋ ์ ๋ ฌํด์ ์ด๋ถํ์์ผ๋ก ๊ตฌํ ์ ์์๊ฑฐ๊ฐ๊ธด ํ๋ฐ…… $N$ ์ ํ์ด 100๋ง์ด๋ผ $O(29 \times N\log{N})$์ ํ๋ฉด ์ฃฝ์ฌ๋ฒ๋ฆฌ๊ฒ ๋ค๋ ๋ง๊ณผ ๊ฐ์ ๊ฒ ๊ฐ๋ค. ์ด? ๊ทผ๋ฐ ๋ด๊ฐ ํ์ํ๊ฑด, ๋นํธ๋จ์๋ก ํ๋์ฉ ํ์ฅํด๋๊ฐ๋ฉด์ ์ ๋ ฌํ๋๊ฑฐ๋ค. ์ด๊ฒ ๋ฐ๋ก Radix Sort ์๋๊ฐ? ๊ฒ๋ค๊ฐ ๋ฐฐ์ด ๋๊ฐ๋ก ์ชผ๊ฐ์ ธ์์๋, ๋ค๋ฅธ ๋ฐฐ์ด์์ ํ๋ํ๋ ํฉ์ด ์ ์์ ๋ค์ด์๋์ง ํ์ธํ๋๊ฑด ๊ทธ๋ฆฌ๋ํ๊ฒ 0/1๋ก ์ชผ๊ฐ์ง ๋ ๋ฐฐ์ด์ ๋งจ์/๋งจ๋ค๋ฅผ ๋ณด๋๊ฒ๋ง์ผ๋ก ํด๊ฒฐํ ์ ์๋ ๊ฒ ๊ฐ๋ค. ๋ฑ์ ์ด์ฉํด์ ๊ด๋ฆฌํด๋ณด์. ๐ป ํ์ด # ์ฝ๋ (C++): void solve(){ ll N; cin >> N; vector<ll> A(N), B(N); rep(i, 0, N) cin >> A[i]; rep(i, 0, N) cin >> B[i]; vector<ll> bitCountA(30), bitCountB(30); rep(i, 0, N) rep(j, 0, 30){ if((A[i] >> j) & 1) bitCountA[j]++; if((B[i] >> j) & 1) bitCountB[j]++; } ll ans1 = 0; rep(i, 0, 30){ ans1 += (1LL << i) % 1999 * (bitCountA[i] * bitCountB[i]) % 1999; ans1 %= 1999; } cout << ans1 << " "; ll ans2 = 0; vector<ll> dq[2], ndq[2]; dq[0].reserve(N); dq[1].reserve(N); ndq[0].reserve(N); ndq[1].reserve(N); rep(i, 0, N) dq[0].push_back(A[i]); rep(bit, 0, 30){ ndq[0].clear(); ndq[1].clear(); for(ll x: dq[0]) (x >> bit) & 1 ? ndq[1].push_back(x) : ndq[0].push_back(x); for(ll x: dq[1]) (x >> bit) & 1 ? ndq[1].push_back(x) : ndq[0].push_back(x); swap(dq[0], ndq[0]); swap(dq[1], ndq[1]); vector<ll> cand; if(!dq[0].empty()){ cand.push_back(dq[0].front()); cand.push_back(dq[0].back()); } if(!dq[1].empty()){ cand.push_back(dq[1].front()); cand.push_back(dq[1].back()); } bool flag = true; for(auto x: B) for(auto c: cand) if((((x+c) >> bit) & 1) == 0){ flag = false; break; } if(flag) ans2 += (1LL << bit); } cout << ans2 << "\n"; } ๐ ๊ตฌํ ์ฝ๋ ์ ๊ธ
·445 words·3 mins
๐ ๋ฌธ์ ์ ๋ณด # ๋งํฌ: https://www.acmicpc.net/problem/17790 ๋ฒ์ญ ๋ฌธ์ # ๋ฌด๋ฐฉํฅ ๋จ์ ๊ทธ๋ํ G = (V, E)์ ๋ํด, V’ โ V์ธ ๋ถ๋ถ์งํฉ V’๋ฅผ ๋
๋ฆฝ ์งํฉ(independent set)์ด๋ผ๊ณ ๋ถ๋ฅด๋ ๊ฒ์ V’์ ์ด๋ค ๋ ์์๋ ๊ฐ์ ์ผ๋ก ์ฐ๊ฒฐ๋์ด ์์ง ์์ ๋์
๋๋ค. G์ ๋
๋ฆฝ ์งํฉ์ ์ต๋ ๋
๋ฆฝ ์งํฉ(maximum independent set)์ด๋ผ๊ณ ๋ถ๋ฅด๋ ๊ฒ์ G์ ๊ทธ๋ณด๋ค ์๊ฒฉํ๊ฒ ๋ ๋ง์ ์ ์ ์ ๊ฐ์ง ๋
๋ฆฝ ์งํฉ์ด ์์ ๋์
๋๋ค. ํน์ ํ ์ข
๋ฅ์ ์ฐ๊ฒฐ๋ ๊ทธ๋ํ G๊ฐ ์ฃผ์ด์ก์ ๋, G์ ์ต๋ ๋
๋ฆฝ ์งํฉ์ ํฌ๊ธฐ๋ฅผ ๊ตฌํ์ธ์.
·244 words·2 mins
๐ ๋ฌธ์ ์ ๋ณด # ๋งํฌ: https://www.acmicpc.net/problem/14939 ๐ง ๊ด์ฐฐ ๋ฐ ์ ๊ทผ # ๋งจ ์์ค์ ์ด์ฐ์ ์ฐ ์ผ์ฒ๋ฆฌ๋ฅผ ๋๋๋ค๊ณ ๊ฐ์ ํ์. ๋๋ฒ์งธ ์ค๋ถํฐ, ๊ทธ ์์ค์ ๋จ์ ์ ๊ตฌ๋ฅผ ๋๋ ๋ฐฉ๋ฒ์ ํด๋น ์นธ ์๋์ ์ค์์น๋ฅผ ์ปจํธ๋กค ํ๋ ๋ฐฉ๋ฒ์ด ์ ์ผํ๋ค. ์ด๋ฅผ ์ฌ์ฉํ๋ฉด ๋งจ ์์ค์ ์ฒ๋ฆฌํ ์ ์๋ ๋ฐฉ๋ฒ $= 2^{10} = 1024$๊ฐ์ง์ ๋ํด ํด๋ณผ ์ ์๊ณ , ์๋ฎฌ๋ ์ด์
์ $100 \times 100 = 10000$๋ฒ์ผ๋ก ์ถฉ๋ถํ ์๊ฐ ๋ด๋ก ๋ค์ด์จ๋ค. ๋งจ ์๋ซ์ค์ ์ผ์ง ์ ๊ตฌ๊ฐ ๋จ์์์ผ๋ฉด ์๋จ์ ์ ์ํ๋ค. ๐ป ํ์ด # ์ฝ๋ (C++): void solve(){ vector<string> board(10); rep(i, 0, 10) cin >> board[i]; int answer = 1e9; rep(bit, 0, 1<<10){ vector<string> cboard = board; int cnt = 0; auto press = [&](int r, int c){ cnt++; cboard[r][c] = (cboard[r][c] == 'O' ? 'X' : 'O'); if(r > 0) cboard[r-1][c] = (cboard[r-1][c] == 'O' ? 'X' : 'O'); if(r < 9) cboard[r+1][c] = (cboard[r+1][c] == 'O' ? 'X' : 'O'); if(c > 0) cboard[r][c-1] = (cboard[r][c-1] == 'O' ? 'X' : 'O'); if(c < 9) cboard[r][c+1] = (cboard[r][c+1] == 'O' ? 'X' : 'O'); }; rep(c, 0, 10) if(bit & (1 << c)) press(0, c); rep(r, 1, 10) rep(c, 0, 10) if(cboard[r-1][c] == 'O') press(r, c); bool ok = true; rep(c, 0, 10) if(cboard[9][c] == 'O') ok = false; if(ok) answer = min(answer, cnt); } if(answer == 1e9) cout << -1 << '\n'; else cout << answer << '\n'; } ๐ ๊ตฌํ ์ฝ๋ ์ ๊ธ