※ 글쓴이는 취미로 코딩을 익혀보는 사람이라 정확하지 않은 내용을 담고 있을 수 있다 ※
이번에 볼 문제는 백준 13217번 문제인 Honey이다.
문제는 아래 링크를 확인하자.
https://www.acmicpc.net/problem/13217
13217번: Honey
Line 1: Three positive integers: N, Mand K. (N≤ 200,000, K≤ 2,000,000,000, M≤ 500,000) Line 2 to (N + 1): Positive integers mi, one on each line. (mi ≤ 500,000)
www.acmicpc.net
한번에 꿀을 M씩 가져오는 것이 최선의 수이므로, M씩 가져올 수 있는 횟수를 미리 구해두자. 또한, 이와 같이 시행했을 때 각 나무에 남는 꿀의 양을 구해두자.
한번에 꿀을 M씩 가져올 수 있는 횟수가 K 이상이면 한번에 꿀을 M씩 K번 가져오는 것으로 문제를 해결할 수 있다.
그렇지 않은 경우, 남은 꿀 중 한번에 가장 많이 가져올 수 있는 나무부터 순서대로 꿀을 가져오는 것으로 문제를 해결할 수 있다.
K가 충분히 클 경우 K번 모두를 굳이 움직일 필요는 없다는 점을 고려해 위의 내용을 구현하자.
문제의 답이 32비트 정수 자료형을 넘을 수 있으므로 이에 유의해 구현하자.
아래는 제출한 소스코드이다.
#include <iostream>
#include <algorithm>
using namespace std;
typedef long long ll;
ll N, M, K;
ll arr[200000];
ll fullcnt;
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
cin >> N >> M >> K;
for (int i = 0; i < N; i++) {
ll& cur = arr[i];
cin >> cur;
fullcnt += cur / M; cur %= M;
}
sort(arr, arr + N);
if (K <= fullcnt) cout << K * M;
else {
ll ans = fullcnt * M;
K = min(N, (K - fullcnt));
for (int i = 0; i < K; i++) ans += arr[N - 1 - i];
cout << ans;
}
}
728x90
'BOJ' 카테고리의 다른 글
[BOJ 13219 // C++] Trains (0) | 2023.05.28 |
---|---|
[BOJ 13218 // C++] Bitcoin (0) | 2023.05.27 |
[BOJ 13241 // C++] 최소공배수 (0) | 2023.05.25 |
[BOJ 13245 // C++] Sum of digits (0) | 2023.05.24 |
[BOJ 13242 // C++] Harps and Tails (0) | 2023.05.23 |