피너클의 it공부방
백준 18186 라면사기 (Large) (c++) : 피너클 본문
728x90
반응형
https://www.acmicpc.net/problem/18186
그리드 문제다.
이 문제에서 이어진다. 이 문제를 풀고오면 간단하게 풀린다.
https://pinacle.tistory.com/260
백준 18185 라면 사기 (Small) (c++) : 피너클
18185번: 라면 사기 (Small)https://www.acmicpc.net/problem/18185 그리드 문제다. 참 싫다. 라면 한개를 사면 3원, 2개를 사면 5원, 3개를 사면 7원이다. 이걸 다르게 생각하면라면 한개를 사면 3원그 다음에 라
pinacle.tistory.com
여기서 내가 푼 방식을 이용할것이다.
우리가 닌텐도 스위치를 사는데
1개 사면 10만원이고 2개 사면 12만원이라 해보자.
당연히 2개를 살것이다. 근데
1개 사면 10만원이고 2개 사면 500만원이면
당연히 1개를 살것이다.
이 문제도 그렇게 접근하면 된다.
라면 한개 사는데 B원이 들고 그 뒤로 연속으로 사는데는 C원이 든다.
만약 B가 C보다 작다면 그냥 한개씩만 사는게 이득이다.
라면 한개 사는데 1원이고 그 뒤로 연속으로 사는데 100원이면 당연히 한개씩 사는게 이득이다.
만약 B가 C보다 크다면 18185번: 라면 사기 (Small) 이 문제에서 풀었던 방법을 그대로 사용하기만 하면 된다.
cin >> n >> b >> c;
for (int i = 0; i < n; i++) cin >> arr[i];
입력받고
if (b <= c) {
for (int i = 0; i < n; i++) ans += b * arr[i];
cout << ans << '\n';
return 0;
}
b가 c보다 작으면 그냥 b로만 계산을 하고 바로 return 해버린다.
for (int i = 0; i < n; i++) {
if (one == 0 && two == 0) {
ans += b * arr[i];
one += arr[i];
}
아니면 이제 SMALL에서 풀었던 방법 그대로 사용하면 된다.
#include <iostream>
#include <algorithm>
#include <vector>
#include <queue>
#include <tuple>
using namespace std;
long long n, b, c;
long long arr[100001];
long long one = 0, two = 0;
long long ans = 0;
int main(int argc, char** argv)
{
std::ios_base::sync_with_stdio(false);
std::cin.tie(NULL);
cin >> n >> b >> c;
for (int i = 0; i < n; i++) cin >> arr[i];
if (b <= c) {
for (int i = 0; i < n; i++) ans += b * arr[i];
cout << ans << '\n';
return 0;
}
for (int i = 0; i < n; i++) {
if (one == 0 && two == 0) {
ans += b * arr[i];
one += arr[i];
}
else if (one != 0 && two == 0) {
if (one >= arr[i]) {
ans += c * arr[i];
two += arr[i];
one = 0;
}
else {
ans += c * one;
ans += b * (arr[i] - one);
two += one;
one = (arr[i] - one);
}
}
else if (one == 0 && two != 0) {
if (two >= arr[i]) {
ans += c * arr[i];
two = 0;
}
else {
ans += c * two;
ans += b * (arr[i] - two);
one += (arr[i] - two);
two = 0;
}
}
else {
long long newtwo = 0;
if (one >= arr[i]) {
ans += c * arr[i];
two = arr[i];
one = 0;
continue;
}
else {
ans += c * one;
arr[i] -= one;
newtwo = one;
one = 0;
}
if (two >= arr[i]) {
ans += c * arr[i];
one = 0;
two = newtwo;
continue;
}
else {
ans += c * two;
arr[i] -= two;
two = newtwo;
}
ans += b * arr[i];
one = arr[i];
two = newtwo;
}
}
cout << ans << '\n';
return 0;
}
전체코드다.
728x90
반응형
'백준' 카테고리의 다른 글
| 백준 7469 K번째 수 (c++) : 피너클 (0) | 2025.08.20 |
|---|---|
| 백준 4013 ATM (c++) : 피너클 (0) | 2025.08.19 |
| 백준 18185 라면 사기 (Small) (c++) : 피너클 (1) | 2025.08.17 |
| 백준 17071 숨바꼭질 5 (c++) : 피너클 (1) | 2025.08.16 |
| 백준 13544 수열과 쿼리 3 (c++) : 피너클 (0) | 2025.08.15 |
Comments