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 |