https://www.acmicpc.net/problem/30677

 

 

 

#해결 방법

 

일단 그냥 구현 그자체인데

 

소수점 처리에서 아주 귀찮다.

 

입력값의 소수점을 지우기 위해서 

 

            long long combo_bonus = 100 + combo * C;
            long long skill_bonus = 100 + skill[idx] * s[idx];

 

각각 100을 곱해준 상태로 처리하고

10'000을 나눠주고

소수점 내림을해서 처리하도록하자

 

즉 소수가 나올거같을때는 곱해서 소수점을 없애고 나중에 나눠서 

오차를 줄이도록하자

 

#전체 코드

#include <iostream>
#include <vector>
#include <cmath>

using namespace std;

int main() {
    int N, K, C, R;
    cin >> N >> K >> C >> R;

    vector<int> base(K);
    vector<int> s(K);
    vector<int> p(K);

    for (int i = 0; i < K; i++) {
        cin >> base[i];
    }
    for (int i = 0; i < K; i++) {
        cin >> s[i];
    }
    for (int i = 0; i < K; i++) {
        cin >> p[i];
    }

    vector<int> skill(K, 0);
    int combo = 0;
    int stress = 0;
    long long total_stardust = 0;  

    for (int i = 0; i < N; i++) {
        int act;
        cin >> act;

        if (act == 0) {
            stress -= R;
            if (stress < 0) stress = 0;
            combo = 0;
        }
        else {
            int idx = act - 1;
            stress += p[idx];
            if (stress > 100) {
                cout << -1 << '\n';
                return 0;
            }
            long long combo_bonus = 100 + combo * C;
            long long skill_bonus = 100 + skill[idx] * s[idx];
            long long delta_stardust = floor((base[idx] * combo_bonus * skill_bonus) / 10000.0);
            total_stardust += delta_stardust;
            combo++;
            skill[idx]++;
        }
    }

    cout << total_stardust << '\n';

    return 0;
}

'[백준] > C++' 카테고리의 다른 글

백준 10703번 유성 [C++]  (0) 2024.07.11
백준 1456번 거의 소수 [C++]  (0) 2024.07.08
백준 1213번 펠린드롬 만들기 [C++]  (0) 2024.07.05
백준 31718번 Double Up [C++]  (0) 2024.07.04
백준 15831번 준표의 조약돌[C++]  (0) 2024.07.01

+ Recent posts