Search
Duplicate

양념 반 후라이드 반

주차
15
문제번호
16917
언어
C++
티어
브론즈
유형
구현
nj_Blog
nj_상태
이해도
풀이
사람
이해도 2
13 more properties

Memo

로직 설명

반반 치킨으로 구매하지 않는 경우부터 시작하여, 반반 치킨을 하나 씩 증가시켜 구매 금액의 최소값을 구하는 방법으로 구현했습니다.

자료 구조

PASS

코드 설명

long long loop = std::max(X, Y) * 2; while (c_num <= loop) { tmp = X * A + Y * B + c_num * C; if (ans > tmp) ans = tmp; if (X > 0) X--; if (Y > 0) Y--; c_num += 2; }
C++
복사
반반 치킨의 갯수는 max(X, Y) * 2; 보다 커지면 그 이전에 계산한 비용의 최소값 보다 무조건 크기 때문에 조건으로 정했습니다.
X, Y는 0이 되면 안되므로 분기 처리를 해주었습니다.
양념 치킨 1마리 + 후라이드 치킨 1마리 = 반반 치킨 * 2 이므로 c_num += 2

어려웠던 부분

void solve() { if (2 * C > A + B) std::cout << A * X + B * Y; else { int _min = std::min(X, Y); std::cout << 2 * C * _min + (X - _min) * A + (Y - _min) * B; } }
C++
복사
처음 생각했던 것은, 2 * C가 A + B 보다 크면 A * X + B * Y 가 정답이고, 그것이 아니라면 X와 Y의 작은 값을 이용하여 정답을 고르면 된다 생각했습니다.
위 코드의 문제점은, X와 Y의 값이 다르지만 오로지 반반 치킨을 사는 경우가 정답일 경우가 있는데 위 코드는 그 경우에 대한 정답을 구할 수 없습니다.
다른 예외가 있을 수도 있다는 생각에, 새로운 논리(아래 코드)를 적용했습니다.

개선할 부분

PASS

Code

제출 날짜

@4/9/2021

메모리

2016 KB

시간

0 ms
#include <iostream> #include <algorithm> typedef long long ll; ll A, B, C, X, Y, ans; void input_faster() { std::ios_base::sync_with_stdio(false); std::cin.tie(0); std::cout.tie(0); } void input() { input_faster(); std::cin >> A >> B >> C >> X >> Y; } void solve() { ll c_num = 0, tmp, loop = std::max(X, Y) * 2; ans = X * A + Y * B; while (c_num <= loop) { tmp = X * A + Y * B + c_num * C; if (ans > tmp) ans = tmp; if (X > 0) X--; if (Y > 0) Y--; c_num += 2; } std::cout << ans; } int main() { input(); solve(); return (0); }
C++
복사