set 활용법을 몰라서 개고생한 문제.. 너무 힘들었다.
체감 티어 : G1
태그 : greedy, set
모든 행성을 효율적으로 정복하려면 어떻게 해야 할까?
일단 다음과 같은 행동을 취해볼 수 있다.
1. 인구수가 가장 작은 행성부터 정복해 mobilization을 한다.
2. 인구수가 많은 행성부터 정복해 mobilization을 한다.
1번 아이디어는 반례가 생긴다는 것을 몇번의 관찰로 알아낼 수 있다.
그럼 이제 2번 아이디어를 가지고 어떤 식으로 가져가야 할지 생각해 보자.
먼저 고려해야 할 것은 어떤 행성들에서 충원 할 것이냐이다.
이는 최소한의 횟수로 충원 해야 하기에 가장 중요한 부분이다.
일단 전체 행성들의 합들을 이용해 충원 할 행성들을 정해볼 수 있다.
k 개의 우주선으로 정복할 수 있는 행성들 중 인구수가 가장 많은 행성을 정복한 후 바로 충원 한다.
이후 전체 행성들에서 정복한 행성을 제외하고 sum < k 가 될 때까지 정복 및 충원 해주면 된다.
만약 sum > k 이지만 더 이상 정복 및 충원을 할 수 있는 행성이 없으면 나머지 행성을 정복하지 못한다.
따라서 이 경우에는 -1을 출력해 주면 된다.
multiset을 이용해 구현을 하면 O(n log n)에 해결할 수 있다.
'BOJ' 카테고리의 다른 글
BOJ 30408 - 춘배가 선물하는 특별한 하트 (1) | 2023.10.29 |
---|---|
BOJ 1150 - 백업 (1) | 2023.10.28 |
BOJ 5910 - Mountain Climbing (1) | 2023.10.27 |
BOJ 5896 - 효율적으로 소 사기 (2) | 2023.10.25 |
BOJ 21393 - Stock (0) | 2023.10.23 |