본문 바로가기

Computer Science/Algorithm

삼성 S/W expert 2115번 벌꿀 채취

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 = falsebreak; } }
                    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