※ 글쓴이는 취미로 코딩을 익혀보는 사람이라 정확하지 않은 내용을 담고 있을 수 있다 ※
이번에 볼 문제는 백준 5589번 문제인 おせんべい이다.
문제는 아래 링크를 확인하자.
https://www.acmicpc.net/problem/5589
5589번: おせんべい
入力の1行目には2つの整数 R, C (1 ≦ R ≦ 10, 1 ≦ C ≦ 10 000) が空白を区切りとして書かれている. 続く R 行は地震直後の煎餅の状態を表す. (i+1) 行目 (1 ≦ i ≦ R) には, C 個の整数 ai,1, ai,2,
www.acmicpc.net
각 행을 뒤집는 경우(최대 2^10 = 1024가지)마다 문제를 따로 생각해보자.
행을 뒤집는 경우를 고정했다면 각 열의 가능한 경우(2가지) 중 더 많은 1이 있게 하는 경우를 골라 더해 이 고정된 경우의 1의 개수의 최댓값을 구할 수 있다.
각 행마다 위의 값을 구해내 그중 최댓값을 답으로 출력하자.
같은 배치의 열의 경우 모두 같은 결과가 나오게 되므로 같은 열들을 압축해 문제를 빠르게 풀 수 있다.
아래는 제출한 소스코드이다.
#include <iostream>
using namespace std;
int arr[10][10000];
int cnt[512];
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
int R, C; cin >> R >> C;
int RR = (1 << R);
int RRR = RR >> 1;
for (int r = 0; r < R; r++) {
for (int c = 0; c < C; c++) {
cin >> arr[r][c];
}
}
for (int c = 0; c < C; c++) {
int tmp = 0;
for (int r = 0; r < R; r++) {
tmp *= 2;
tmp += arr[r][c];
}
if (tmp >= RRR) tmp ^= RR - 1;
cnt[tmp]++;
}
int ans = 0;
for (int i = 0; i < RRR; i++) {
int tmp = 0;
for (int j = 0; j < RRR; j++) {
int bits = 0;
int ixorj = i ^ j;
while (ixorj) {
if (ixorj & 1) bits++;
ixorj >>= 1;
}
tmp += max(R - bits, bits) * cnt[j];
}
ans = max(ans, tmp);
}
cout << ans;
}
728x90
'BOJ' 카테고리의 다른 글
[BOJ 5590 // C++] 船旅 (0) | 2022.06.19 |
---|---|
[BOJ 14732 // C++] 행사장 대여 (Small) (0) | 2022.06.19 |
[BOJ 24073 // C++] ビ太郎と IOI (Bitaro and IOI) (0) | 2022.06.18 |
[BOJ 5556 // C++] 타일 (0) | 2022.06.17 |
[BOJ 11383 // C++] 뚊 (0) | 2022.06.16 |