14471 포인트 카드
Table of Contents
접근 방법#
당첨 도장이 가장 많은 $m - 1$개의 카드를 이용해 경품과 교환하는 것이 가장 적은 당첨 도장을 구매하게 된다.
따라서 카드를 당첨 도장에 대해 내림차순으로 정렬하여 첫 $m - 1$개의 카드에 대해 필요한 당첨 도장의 개수를 구해주면 된다.
구현#
#include <stdio.h>
#include <stdlib.h>
typedef struct {
size_t win;
size_t lose;
} card_t;
int card_comp_desc(const void* p, const void* q) {
size_t i = ((card_t*)p)->win;
size_t j = ((card_t*)q)->win;
return (i < j) - (i > j);
}
int main(void) {
size_t n = 0;
size_t m = 0;
scanf("%zu %zu", &n, &m);
card_t cards[1000] = { 0, };
for (size_t i = 0; i < m; i++) {
scanf("%zu %zu", &cards[i].win, &cards[i].lose);
}
qsort(cards, m, sizeof(*cards), card_comp_desc);
size_t answer = 0;
for (size_t i = 0; i < m - 1; i++) {
if (cards[i].win >= n) {
continue;
} else {
answer += n - cards[i].win;
}
}
printf("%zu\n", answer);
return 0;
}
m개의 카드를 입력받은 후 이를 win에 대해 내림차순 정렬한다.
이때 win은 그 카드에 찍힌 당첨 도장의 개수이다.
한편 모든 카드는 동일한 도장 개수를 가지므로 win이 같으면 반대로 꽝 도장 lose의 개수도 동일하다.
즉, win이 같은 상황이어도 lose는 고려하지 않아도 된다.
정렬한 cards의 첫 m - 1개를 순회하며 필요한 당첨 도장의 개수를 계산한다.
당첨 도장의 개수가 이미 n개 이상으로 당첨 도장이 더 필요하지 않은 경우는 무시한다.
외부 링크#
다른 글 읽어보기