hotamul의 개발 이야기

[Algorihtm][C++] SWEA. 5644. [모의 SW 역량테스트] 무선 충전 본문

myt-algorithm-practice/Samsung SW Certi Adv

[Algorihtm][C++] SWEA. 5644. [모의 SW 역량테스트] 무선 충전

hotamul 2021. 11. 16. 21:30

url: https://swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AWXRDL1aeugDFAUo 

 

SW Expert Academy

SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요!

swexpertacademy.com

 

 

코드

#define _CRT_SECURE_NO_WARNINGS
#include <cstdio>
#define MAXM    100
#define MAXA    8
#define a       0
#define b       1
 
int T, M, A;
int move_cmd[2][MAXM + 1];
const int dr[] = { 0,-1,0,1,0 };
const int dc[] = { 0,0,1,0,-1 };
struct BCInfo {
    int r, c, range, power;
};
BCInfo bc[MAXA];
struct Person {
    int r, c;
};
Person person[2];
 
int _get_max(int value) {
    return value > 0 ? value : -value;
}
 
int get_distance(const BCInfo bc_pos, const Person man_pos) {
    int ret = _get_max(bc_pos.r - man_pos.r) + _get_max(bc_pos.c - man_pos.c);
    return ret;
}
 
int solve() {
    int ret = 0;
    person[a] = { 1,1 };
    person[b] = { 10,10 };
    for (int time = 0; time <= M; time++) {
        for (int i = 0; i < 2; i++) {
            person[i].r += dr[move_cmd[i][time]];
            person[i].c += dc[move_cmd[i][time]];
        }
        int in_range_cnt[2] = { 0, };
        int in_bc_id[2][MAXA] = { 0, };
        for (int i = 0; i < 2; i++) {
            for (int id = 0; id < A; id++) {
                if (bc[id].range >= get_distance(bc[id], person[i])) {
                    in_bc_id[i][in_range_cnt[i]++] = id;
                }
            }
        }
        int candi = 0;
        if (in_range_cnt[a] == 0 || in_range_cnt[b] == 0) {
            for (int i = 0; i < in_range_cnt[a]; i++) {
                int tmp_bc_id = in_bc_id[a][i];
                if (bc[tmp_bc_id].power > candi) {
                    candi = bc[tmp_bc_id].power;
                }
            }
            for (int i = 0; i < in_range_cnt[b]; i++) {
                int tmp_bc_id = in_bc_id[b][i];
                if (bc[tmp_bc_id].power > candi) {
                    candi = bc[tmp_bc_id].power;
                }
            }
        }
        else {
            for (int i = 0; i < in_range_cnt[a]; i++) {
                for (int j = 0; j < in_range_cnt[b]; j++) {
                    int tmp_bc_id[2] = { in_bc_id[a][i], in_bc_id[b][j] };
                    int temp = bc[tmp_bc_id[a]].power + bc[tmp_bc_id[b]].power;
                    if (tmp_bc_id[a] == tmp_bc_id[b]) {
                        temp /= 2;
                    }
                    if (temp > candi) {
                        candi = temp;
                    }
                }
            }
        }
        ret += candi;
    }
    return ret;
}
 
int main() {
    // freopen("sample_input.txt", "r", stdin);
    scanf("%d", &T);
    for (int tc = 1; tc <= T; tc++) {
        scanf("%d %d", &M, &A);
        for (int i = 0; i < 2; i++) {
            for (int time = 1; time <= M; time++) {
                scanf("%d", &move_cmd[i][time]);
            }
        }
        for (int id = 0; id < A; id++) {
            scanf("%d %d %d %d", \
                &bc[id].c, &bc[id].r, &bc[id].range, &bc[id].power);
        }
        int ans = solve();
        printf("#%d %d\n", tc, ans);
    }
    return 0;
}
Comments