https://www.acmicpc.net/problem/1049
1049번: 기타줄
첫째 줄에 N과 M이 주어진다. N은 100보다 작거나 같은 자연수이고, M은 50보다 작거나 같은 자연수이다. 둘째 줄부터 M개의 줄에는 각 브랜드의 패키지 가격과 낱개의 가격이 공백으로 구분하여 주
www.acmicpc.net
기타줄을 구매하는 방법은 세 개가 있다. 기타줄 팩만 구매하는 방법, 낱개 기타줄만 구매하는 방법, 낱개 기타줄은 5개 이하로 구매하고 나머지는 팩으로 구매하는 방법. 이 이외의 방법은 효율이 떨어지므로 이 세 방법을 모두 계산해 최솟값을 출력하면 된다.
#include <cstdio>
#define MAX 0x3f3f3f3f
int min(int a, int b) { return a < b ? a : b; }
int main()
{
// N: 끊어진 기타줄의 수, M: 기타줄 브랜드의 수, buf: 각 가격을 입력받을 버퍼
// pack, one: 각 브랜드의 기타줄 팩과 낱개의 최소 가격
// price: 기타줄 팩만 사는 경우와 낱개만 사는 경우,
// 팩으로 6개씩 산 뒤 나머지를 낱개로 사는 경우
// ans: price의 최솟값을 저장할 공간
int N, M, buf, pack = MAX, one = MAX, price[3], ans = MAX;
// 끊어진 기타줄 수와 기타줄 브랜드의 수를 입력받은 뒤
scanf("%d %d", &N, &M);
// 각 기타줄 브랜드에 대해
while (M--) {
// 기타줄 팩과 낱개의 값의 최솟값을 저장
scanf("%d", &buf);
pack = min(pack, buf);
scanf("%d", &buf);
one = min(one, buf);
}
// 기타줄 팩만 사는 경우와 낱개만 사는 경우,
// 팩으로 6개씩 산 뒤 나머지를 낱개로 사는 경우를 각각 저장
price[0] = pack * (N / 6 + (N % 6 != 0));
price[1] = one * N;
price[2] = pack * (N / 6) + one * (N % 6);
// price의 최솟값을 ans에 저장한다
for (int i = 0; i < 3; i++) ans = min(ans, price[i]);
// 기타줄을 사는 최소 비용을 출력한다
printf("%d\n", ans);
return 0;
}
'알고리즘 > 문제 풀이' 카테고리의 다른 글
1074번: Z (0) | 2021.12.06 |
---|---|
1065번: 한수 (0) | 2021.12.06 |
1043번: 거짓말 (0) | 2021.12.06 |
1041번: 주사위 (0) | 2021.12.06 |
1026번: 보물 (0) | 2021.12.06 |