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++
복사