2115번 벌꿀 채취
- N*N 크기의 map에 벌꿀의 양이 각각 들어가 있다. 2명의 사람이 벌꿀을 채취하는데 벌꿀을 가로 형태로만 채취할 수 있고 주어진 통의 갯수만큼만 채취 가능하다. 예를 들어 M=2 이면 {(0,0), (0,1)} 칸의 벌꿀을 채취할 수 있다. 채취한 벌꿀을 제곱하고 더해 Profit을 계산할 수 있다. 8, 9를 채취했다면 64+81 = 145 가 Profit이 된다. 여기서 최대로 채취할 수 있는 벌꿀의 양이 주어진다. 2명의 사람이 영역을 겹치지 않고 벌꿀을 채취했을 때 가장 큰 Profit을 구하는 문제다.
- 우선 2명의 사람이 겹치지 않게 영역을 나눴고, 최대 이익을 산출하기 위해 비트 마스킹으로 나올 수 있는 모든 이익을 계산했다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 | #include <iostream> #include <cmath> using namespace std; int N, M, C; int map[11][11]; int X=0, Y = 0; int ans = 0; void collectA(int x ,int y) { int totSumA = 0; int sumA; int honeysumA; for (int i = 1; i < (1 << M); i++) { honeysumA = 0; sumA = 0; for (int j = 0; j < M; j++) { if ((i & (1 << j)) > 0) { if (honeysumA + map[x][y + j] <= C) { honeysumA += map[x][y + j]; sumA += map[x][y + j] * map[x][y + j]; } } } if (totSumA < sumA) { totSumA = sumA; } } X = totSumA; } void collectB(int x, int y) { int totSumB = 0; int honeysumB; int sumB = 0; for (int i = 1; i < (1 << M); i++) { honeysumB = 0; sumB = 0; for (int j = 0; j < M; j++) { if ((i& (1 << j)) > 0) { if (honeysumB + map[x][y + j] <= C) { honeysumB += map[x][y + j]; sumB += map[x][y + j] * map[x][y + j]; } } } if (totSumB < sumB) { totSumB = sumB; } } Y = totSumB; } bool c = true; void solve() { for (int i = 0; i < N; i++) { for (int j = 0; j <= N - M; j++) { collectA(i, j); for (int a = i; a < N; a++) { for (int b = 0; b <= N - M; b++) { if (a == i) { if (b <= j) continue; } c = true; for (int t = 0; t < M; t++) { if (i == a && j + t == b) { c = false; break; } } if(c){ collectB(a, b); } if (ans < X + Y && X>0 && Y >0) { ans = X + Y; } Y = 0; } } X = 0; } } } int main() { int T; cin >> T; for (int i = 1; i <= T; i++) { cin >> N >> M >> C; ans = 0; for (int a = 0; a < N; a++) { for (int b = 0; b < N; b++) { cin >> map[a][b]; } } solve(); cout <<"#"<< i<<' '<< ans << endl; } return 0; } | cs |
반응형
'Computer Science > Algorithm' 카테고리의 다른 글
[BOJ 14500] 테트로미노 (0) | 2018.08.06 |
---|---|
[BOJ 1107] 리모컨 (0) | 2018.08.06 |
[BOJ 1476] 날짜 계산 (0) | 2018.08.06 |
삼성 S/W expert 2117번 홈 방범 서비스 (0) | 2018.06.05 |
삼성 S/W expert 2382번 미생물 격리 (0) | 2018.05.31 |