피너클의 it공부방

백준 18186 라면사기 (Large) (c++) : 피너클 본문

백준

백준 18186 라면사기 (Large) (c++) : 피너클

피너클 2025. 8. 18. 10:38
728x90
반응형

18186번: 라면 사기 (Large)

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

 

그리드 문제다.

18185번: 라면 사기 (Small)

 

이 문제에서 이어진다. 이 문제를 풀고오면 간단하게 풀린다.

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
반응형
Comments