ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • SWEA 5644 [무선 충전]
    알고리즘 풀이/시뮬레이션 2018. 10. 4. 06:04

    SW Expert Academy 무선 충전 : https://swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AWXRDL1aeugDFAUo&categoryId=AWXRDL1aeugDFAUo&categoryType=CODE&&&


    //SWEA는 문제를 무단으로 복제하는 것을 금지하기에, 문제시 삭제하겠습니다.




    간단한 시뮬레이션 문제입니다.


    우선 현재 시점에서 사람1과 사람2가 각 배터리의 충전 범위에 들어와있는지 확인합니다.


    충전범위에 있을 경우, 각 사람에 맞는 배열로, 해당 배터리의 충전 범위에 들어왔는지 bool을 통해 체크해줍니다.


    배터리의 개수만큼 이중 for문을 돕니다.



    1. i == j 일 경우 => 만약 둘다 해당 배터리의 범위에 있으면 +성능


    2. 그 외의 경우 => 해당 인덱스 배터리 범위에 있으면 각각 +성능







    (갑자기 gif를 만들어보고 싶었습니다.)





    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
    75
    76
    77
    78
    79
    #include <iostream>
    #include <vector>
    #include <cmath>
    using namespace std;
    class BC {
    public:
        int X, Y, C, P; //C : 충전 범위. P : 성능
        BC(int X, int Y, int C, int P) : X(X), Y(Y), C(C), P(P) {}
    };
    vector<BC> battery;
    int H_1[100];    //사람 1의 족적
    int H_2[100];    //사람 2의 족적
    int M;  //총 이동시간
    int A;  //배터리 개수
    bool H1_on[8];  //사람 1이 각 배터리 충전 범위에 있는지
    bool H2_on[8];  //사람 2가 있는지
    int d[5][2= {{00}, {-10}, {01}, {10}, {0-1}};
    int perform_check(int h1_i, int h1_j, int h2_i, int h2_j) {
        int result = 0;
        for(int i = 0; i < A; i++) {
            H1_on[i] = false;
            H2_on[i] = false;
        }
        for(int b = 0; b < A; b++) {  //배터리 충전범위에 있나 체크
            if(abs(h1_i - battery[b].Y) + abs(h1_j - battery[b].X) <= battery[b].C)
                H1_on[b] = true;
            if(abs(h2_i - battery[b].Y) + abs(h2_j - battery[b].X) <= battery[b].C)
                H2_on[b] = true;
        }   //충전범위 다 체크해준뒤, 계산시작
        for(int i = 0; i < A; i++) {
            for(int j = 0; j < A; j++) {
                int temp = 0;
                if(i == j) {
                    if(H1_on[i] || H2_on[j])
                        temp = battery[i].P;
                }
                else {
                    if(H1_on[i])
                        temp += battery[i].P;
                    if(H2_on[j])
                        temp += battery[j].P;
                }
                result = result > temp ? result : temp;
            }
        }
        return result;
    }
    int main() {
        int T;
        cin >> T;
        for(int t= 1; t <= T; t++) {
            cin >> M >> A;
            for(int i = 0; i < M; i++)
                cin >> H_1[i];
            for(int i = 0; i < M; i++)
                cin >> H_2[i];
            for(int a=0; a<A; a++) {
                int x, y, c, p;
                cin >> x >> y >> c >> p;
                BC bc(x, y, c, p);
                battery.push_back(bc);
            }
            int h1_i = 1;   //초기 좌표 설정
            int h1_j = 1;
            int h2_i = 10;
            int h2_j = 10;
            int Result = perform_check(h1_i, h1_j, h2_i, h2_j);
            for(int m = 0; m < M; m++) {
                h1_i += d[H_1[m]][0];
                h1_j += d[H_1[m]][1];
                h2_i += d[H_2[m]][0];
                h2_j += d[H_2[m]][1];
                Result += perform_check(h1_i, h1_j, h2_i, h2_j);
            }
            cout << "#" << t << " " << Result << endl;
            battery.clear();
        }
        return 0;
    }
    cs


    반응형

    '알고리즘 풀이 > 시뮬레이션' 카테고리의 다른 글

    SWEA 5650 [핀볼 게임]  (0) 2018.09.25
    SWEA 5658 [보물상자 비밀번호]  (0) 2018.09.22
    SWEA 5656 [벽돌 깨기]  (2) 2018.09.22
    BOJ 15685 [드래곤 커브]  (3) 2018.09.17

    댓글

Designed by Tistory.