알고리즘/백준

[백준/C,C++] 1049번: 기타줄

이민훈 2021. 4. 20. 11:03

www.acmicpc.net/problem/1049

 

1049번: 기타줄

첫째 줄에 N과 M이 주어진다. N은 100보다 작거나 같은 자연수이고, M은 50보다 작거나 같은 자연수이다. 둘째 줄부터 M개의 줄에는 각 브랜드의 패키지 가격과 낱개의 가격이 공백으로 구분하여 주

www.acmicpc.net

풀이

살짝 헷갈리는 문제입니다.

 

경우를 잘 따져야 하는데요.. 크게 2가지로 나눌 수 있습니다.

 

패키지 가격보다 낱개 6개의 가격이 더 낮은 경우, 낱개로 모두 구매하는 것이 최소 가격입니다.

 

하지만 패키지 가격이 낱개 6개의 가격보다 더 낮은 경우가 중요합니다.

 

어쨌든 필요한 기타 줄이 6개 이상이라면 그만큼은 무조건 패키지를 사는 것이 최소 가격일 겁니다.

 

하지만 패키지를 살 수 있는 만큼 모두 구매한 후

 

남은 필요 기타 줄이 6개 미만이라면 비교 대상이 달라지는데

 

낱개가격 * 남은 필요 기타 줄과 패키지 가격을 비교해서 남은 개수를 채워야 합니다.

 

#include<iostream>

using namespace std;

int main(void)
{
    int n, m; cin >> n >> m;
    int package = 100000, piece = 100000;
    int res = 0;

    for (int i = 0; i < m; i++) {
        for (int j = 0; j < 2; j++) {
            int tmp; cin >> tmp;
            if (j == 0) {
                package = min(package, tmp);
            }
            else {
                piece = min(piece, tmp);
            }
        }
    }

    if (n >= 6) {
        if (package < piece * 6) {
            res += (n / 6) * package;
            n = n - ((n / 6) * 6);
        }
        else {
            res += n * piece;
            n = 0;
        }
    }

    if (n != 0) {
        package < piece* n ? res += package : res += piece * n;
    }

    cout << res;

    return 0;
}

반례

Input

7 1

100 99

Output

199

 

Input

23 3

50 25

70 28

60 20
Output

200